Как завершить сеанс ssh, который вызывает многопроцессорную обработку python

#python #bash #ssh #multiprocessing #python-multiprocessing

#python #bash #ssh #многопроцессорная обработка #python-многопроцессорность

Вопрос:

У меня есть программа, которая выполняется на сервере, к которому обращаются клиенты. Клиенты могут отправлять команды серверу через ssh следующим образом:

 ssh user@server activate
  

Эта команда выполняет скрипт bash, который, в свою очередь, выполняет скрипт Python 2.7. Затем скрипт python запускает дочерний процесс, используя Multiprocessing.Process() класс python. Этот дочерний процесс предназначен для сохранения и выполнения задач в фоновом режиме (например, в течение> 1 месяца), пока ему не будет предложено остановиться другой командой ssh.

Пример скрипта python ( test.py ), который запускает некоторую произвольную функцию открытого типа в отдельном процессе:

 from time import sleep
from multiprocessing import Process


def run_child_process(callback_func):
    child = Process(target=callback_func)
    child.start()


def task():
    while True:
        # Do some arbitrary task continually.
        print("Running")
        sleep(300)


def run():
    run_child_process(task)


if __name__ == "__main__":
    run()
  

Этот скрипт вызывается через скрипт bash следующим образом:

 #!/bin/bash
python -m test.py > /dev/null
  

Моя проблема в том, что сеанс ssh не закрывается после создания дочернего процесса. В то время как исходный родительский процесс завершается, кажется, что присутствие вновь созданного дочернего процесса препятствует закрытию сеанса ssh.

Если вместо этого я запускаю дочерний процесс с помощью os.fork() , вызов ssh завершается корректно и дочерний процесс остается запущенным:

 def create_child_fork(callback_func):
    if os.fork() > 0:
        return
    os.setsid()
    callback_func()
    sys.exit()
  

Мне интересно, почему то же самое, похоже, невозможно с помощью multiprocessing.Process() .