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