Как завершить сеанс SSH, который вызывает многопроцессорность Python - PullRequest
1 голос
/ 26 марта 2019

У меня есть программа, которая работает на сервере, к которому получают доступ клиенты. Клиенты могут выдавать команды серверу через 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().

...