デーモンとして走るプログラムのテストを書いていたときに、一定時間後に強制終了する必要が出てきました。
用件
main process
|
|--- subprocess1
|--- subprocess2
|--- subprocess3
サブプロセスたちは下記のように起動しています。
# main.py
from multiprocessing import Process
ps = [
Process(target=hogehoge1),
Process(target=hogehoge2),
Process(target=hogehoge3),
]
for i in ps:
i.start()
やりたいこと
別プロセスからなんらかの方法でサブプロセスたちごと消す。
まず SIGINT (ctrl + c)
ターミナルで動かしてるときはこいつで全消しできるのでやってみる。
# other.py
import subprocess
from time import sleep
from signal import SIGINT
proc = subprocess.Popen(cmd)
sleep(5) # ちょっと待つ
proc.send_signal(SIGINT)
結果
親だけ消えてサブプロセスたちが残ります。
親で SIGINT をキャッチする
この方法でうまく行きました。親には信号がいってるはず(さっきの実験より)なので親からサブプロセスを消してみます。
親ファイルを変更します。
# main.py
from signal import SIGINT
import signal
def signalHandler(signal, handler) :
for i in ps:
i.terminate()
exit(0)
if __name__ == "__main__":
signal.signal(signal.SIGINT, signalHandler)
signal.signal(signal.SIGTERM, signalHandler)
注意:exit(0)
を忘れると親プロセスが殺せなくなります。
まとめ
雰囲気でマルチプロセスをやるのはよくない。