web-dev-qa-db-ja.com

別のプロセスを開始する

最初のスクリプトが終了した後も新しいプロセスが実行され続けるように、スクリプトで新しいプロセスを開始する必要があります。 multiprocessing.Processを使用して新しいプロセスを開始し、daemon=Trueを設定して、作成したプロセスの実行を継続しながらメインスクリプトを終了できると期待していました。

しかし、メインスクリプトが終了すると、2番目のプロセスはサイレントに終了するようです。これは予想される動作ですか、それとも私は何か間違ったことをしていますか?

15
JacquesB

Pythonドキュメントから:

プロセスが終了すると、そのデーモンの子プロセスをすべて終了しようとします。

これは予想される動作です。

14
Justin Ardini

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
10
unutbu

subprocessモジュールを使用するだけです。

import subprocess
subprocess.Popen(["sleep", "60"])
8
Philipp

これはSOに関連する質問であり、回答の1つがこの問題の優れた解決策を提供します。

"Pythonからの生成プロセス"

1
Pontus

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)
0
ilias iliadis