LoginSignup
1
4

More than 3 years have passed since last update.

[Python] multiprocessで起動した子プロセスを別プロセスから簡単に落とす方法

Last updated at Posted at 2020-04-28

デーモンとして走るプログラムのテストを書いていたときに、一定時間後に強制終了する必要が出てきました。

用件

 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) を忘れると親プロセスが殺せなくなります。

まとめ

雰囲気でマルチプロセスをやるのはよくない。

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4