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] 操作は許可されていません