Запуск отдельного процесса

Я хочу, чтобы script запускал новый процесс, так что новый процесс продолжает работать после выхода из начального script. Я ожидал, что я могу использовать multiprocessing.Process для запуска нового процесса и установить daemon=True, чтобы основной script мог выйти, пока созданный процесс продолжает работать.

Но кажется, что второй процесс бесшумно завершается при выходе из главного script. Является ли это ожидаемым поведением, или я делаю что-то неправильно?

Ответы

Ответ 1

В документах Python:

Когда процесс завершается, он пытается прекратить весь его демонический ребенок процессы.

Это ожидаемое поведение.

Ответ 2

Если вы находитесь в системе 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)

Запуск этого процесса создает два процесса. Вы можете убить родителя, не убивая ребенка. Например, при запуске script вы увидите что-то вроде:

% script.py
I'm the parent
I'm just a child
I'm the parent
I'm just a child
...

Остановите script с помощью ctrl-Z:

^Z
[1]+  Stopped                 script.py

Найдите идентификатор процесса для родителя. Это будет меньший из двух идентификаторов процесса, так как родитель пришел первым:

% 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

Ответ 3

Просто используйте модуль subprocess:

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