4

自動テストの一部として、呼び出し元のスクリプトの終了後に対話する必要がある2つの異なるサーバーを起動する2つのシェルスクリプトを呼び出す必要があるPythonスクリプトがあります。(実際にはjythonスクリプトですが、現時点でそれが重要かどうかはわかりません。)Pythonスクリプトが終了した後もサーバーが稼働し続けるようにするには、どうすればよいですか?

この時点で、それらは次のように呼ばれます。

def runcmd(str, sleep):
    debug('Inside runcmd, executing: ' + str)
    os.chdir("/new/dir/")
    directory = os.getcwd()
    print 'current dir: '+ directory
    os.system(str)

t = threading.Thread(
        target=runcmd,
        args=( cmd, 50,)
    )
4

5 に答える 5

2

PythonスレッドはすべてPythonで死にます。また、os.systemがブロックしています。しかし、それは問題ありません。os.system()が実行するコマンドが新しいプロセス(子プロセスではない)を起動する場合は、すべて問題ありません。たとえば、Windowsでは、コマンドが「start」で始まる場合、「start」されたプロセスはPythonが終了した後も残ります。

編集:Linuxnohupの場合と同等です。start(S. Lottに感謝します)。

于 2010-02-10T21:35:56.940 に答える
1

os.system()起動するプロセスが終了するまで戻りません。subprocessまたは、別のプロセスで使用するRuntime.exec()場合に使用します。

于 2010-02-10T21:34:31.390 に答える
0

subprocess.Popenを使用する方がうまくいくのではないかと思います。

たぶんshell=Trueのようなことをしている

于 2010-02-10T21:35:20.363 に答える
0

スレッドはプロセスの一部であるため、機能しません。system新しいプロセスの実行時にブロックされるため、呼び出しは機能しません。

os.fork()新しいプロセスを生成し、新しいプロセスで実行するようなものを使用する必要があります。これに対するいくつかの優れたクックブックスタイルのソリューションのサブプロセスを見てください。

于 2010-02-10T21:38:44.110 に答える
0

一般に、親から独立した長時間実行サーバーを起動するには、サーバーをデーモン化する必要があります。環境に応じて、このプロセスを支援できるさまざまなラッパーがあります。

于 2010-02-10T21:39:23.447 に答える