#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()
.