最初のスクリプトが終了した後も新しいプロセスが実行され続けるように、スクリプトで新しいプロセスを開始する必要があります。 multiprocessing.Process
を使用して新しいプロセスを開始し、daemon=True
を設定して、作成したプロセスの実行を継続しながらメインスクリプトを終了できると期待していました。
しかし、メインスクリプトが終了すると、2番目のプロセスはサイレントに終了するようです。これは予想される動作ですか、それとも私は何か間違ったことをしていますか?
Pythonドキュメントから:
プロセスが終了すると、そのデーモンの子プロセスをすべて終了しようとします。
これは予想される動作です。
UNIXシステムを使用している場合は、 os.fork を使用できます。
import os
import time
pid=os.fork()
if pid:
# parent
while True:
print("I'm the parent")
time.sleep(0.5)
else:
# child
while True:
print("I'm just a child")
time.sleep(0.5)
これを実行すると、2つのプロセスが作成されます。あなたは子供を殺さずに親を殺すことができます。たとえば、スクリプトを実行すると、次のように表示されます。
% script.py
I'm the parent
I'm just a child
I'm the parent
I'm just a child
...
Ctrl-Zでスクリプトを停止します。
^Z
[1]+ Stopped script.py
親のプロセスID番号を見つけます。親が最初に来たので、2つのプロセスID番号のうち小さい方になります。
% ps axuw | grep script.py
unutbu 6826 0.1 0.1 33792 6388 pts/24 T 15:09 0:00 python /home/unutbu/pybin/script.py
unutbu 6827 0.0 0.1 33792 4352 pts/24 T 15:09 0:00 python /home/unutbu/pybin/script.py
unutbu 6832 0.0 0.0 17472 952 pts/24 S+ 15:09 0:00 grep --color=auto script.py
親プロセスを強制終了します。
% kill 6826
Script.pyをフォアグラウンドに復元します。
% fg
script.py
Terminated
子プロセスがまだ実行されていることがわかります。
% I'm just a child
I'm just a child
I'm just a child
...
(新しいターミナルで)子供を殺す
% kill 6827
subprocess
モジュールを使用するだけです。
import subprocess
subprocess.Popen(["sleep", "60"])
これはSOに関連する質問であり、回答の1つがこの問題の優れた解決策を提供します。
UNIXシステムを使用している場合( ドキュメントを使用 ):
#!/usr/bin/env python3
import os
import sys
import time
import subprocess
import multiprocessing
from multiprocessing import Process
def to_use_in_separate_process(*args):
print(args)
#check args before using them:
if len(args)>1:
subprocess.call((args[0], args[1]))
print('subprocess called')
def main(apathtofile):
print('checking os')
if os.name == 'posix':
print('os is posix')
multiprocessing.get_context('fork')
p = Process(target=to_use_in_separate_process, args=('xdg-open', apathtofile))
p.run()
print('exiting def main')
if __name__ == '__main__':
#parameter [1] must be some file that can be opened by xdg-open that this
#program uses.
if len(sys.argv)>1:
main(sys.argv[1])
print('we can exit now.')
else:
print('no parameters...')
print('mother program will end now!')
sys.exit(0)