Создать цикл Python как «отдельный» дочерний процесс - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть потенциально бесконечный цикл Python 'while', который я хотел бы продолжать выполнять даже после того, как основное выполнение скрипта / процесса было завершено. Кроме того, я хотел бы иметь возможность позже завершить этот цикл из CLI Unix, если это необходимо (например, kill -SIGTERM PID), поэтому потребуется также и идентификатор цикла. Как бы я это сделал? Спасибо!

Loop:

args = 'ping -c 1 1.2.3.4'

while True:
    time.sleep(60)
    return_code = subprocess.Popen(args, shell=True, stdout=subprocess.PIPE)
    if return_code == 0:
        break

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

Popen возвращает объект, который имеет pid.В соответствии с doc

Popen.pid ID процесса дочернего процесса.

Обратите внимание, что если для аргумента оболочки установлено значение True, этоID процесса порожденной оболочки.

Вам нужно отключить shell=True, чтобы получить pid процесса, иначе он даст pid оболочки.

args = 'ping -c 1 1.2.3.4'

while True:
    time.sleep(60)
    with subprocess.Popen(args, shell=False, stdout=subprocess.PIPE) as proc:
        print('PID: {}'.format(proc.pid))
        ...
0 голосов
/ 19 апреля 2019

В python родительские процессы пытаются завершить все свои демонические дочерние процессы при выходе. Однако вы можете использовать os.fork() для создания совершенно нового процесса:

import os

pid = os.fork()
if pid:
   #parent
   print("Parent!")
else:
   #child
   print("Child!")
...