fork()子を呼び出し、処理を開始するコードがsetsid()いくつかあります。子プロセスのいずれかが終了した場合 ( waitpid(-1, 0))、すべての子プロセス グループを強制終了します。
child_pids = []
for child_func in child_functions:
pid = fork()
if pid == 0:
setsid()
child_func()
exit()
else:
child_pids.append(pid)
waitpid(-1, 0)
for child_pid in child_pids:
try:
killpg(child_pid, SIGTERM)
except OSError as e:
if e.errno != 3: # 3 == no such process
print "Error killing %s: %s" %(child_pid, e)
ただし、killpg「操作が許可されていません」で呼び出しが失敗することがあります。
22841 を殺すエラー: [Errno 1] 操作は許可されていません
なぜこれが起こっているのでしょうか?
完全な実際の例:
シグナルインポート SIGTERM から
sysインポート出口から
from time import sleep
OS インポートから *
デフスロー():
フォーク()
スリープ(10)
デフォルト高速():
スリープ(1)
child_pids = []
[高速、低速、低速、高速] の child_func の場合:
pid = フォーク()
pid == 0 の場合:
セットid()
child_func()
終了(0)
そうしないと:
child_pids.append(pid)
ウェイトピッド(-1, 0)
child_pids の child_pid の場合:
試す:
killpg(child_pid, SIGTERM)
e: として OSError を除く
print "%s の強制終了エラー: %s" %(child_pid, e)
どちらが得られますか:
$ python killpg.py 23293 を殺すエラー: [Errno 3] そのようなプロセスはありません 23296 を殺すエラー: [Errno 1] 操作は許可されていません