13

Cで記述されたサーバーをテストするPythonプログラムを作成しようとしています。Pythonプログラムは、subprocessモジュールを使用してコンパイル済みサーバーを起動します。

pid = subprocess.Popen(args.server_file_path).pid

これは正常に機能しますが、エラーが原因でPythonプログラムが予期せず終了した場合、生成されたプロセスは実行されたままになります。Pythonプログラムが予期せず終了した場合に、サーバープロセスも強制終了するようにする方法が必要です。

詳細:

  • LinuxまたはOSXオペレーティングシステムのみ
  • サーバーコードはいかなる方法でも変更できません
4

1 に答える 1

21

プロセスをatexit.register終了する関数を作成します。

import atexit
process = subprocess.Popen(args.server_file_path)
atexit.register(process.terminate)
pid = process.pid

または多分:

import atexit
process = subprocess.Popen(args.server_file_path)
@atexit.register
def kill_process():
    try:
        process.terminate()
    except OSError:
        pass #ignore the error.  The OSError doesn't seem to be documented(?)
             #as such, it *might* be better to process.poll() and check for 
             #`None` (meaning the process is still running), but that 
             #introduces a race condition.  I'm not sure which is better,
             #hopefully someone that knows more about this than I do can 
             #comment.

pid = process.pid

これは、Pythonを非優雅な方法で死に至らしめるために厄介なことをした場合には役に立たないことに注意してください(たとえば、経由os._exitまたはまたはを引き起こしたSegmentationFault場合BusError

于 2013-01-02T20:09:11.743 に答える