我有一个程序在客户端访问的服务器上运行。客户端可以通过ssh向服务器发出命令,如下所示:
ssh user@server activate
此命令执行一个bash脚本,该脚本又执行一个Python 2.7脚本。然后,python脚本使用python的Multiprocessing.Process()
类产生一个子进程。此子进程旨在在后台(例如,大于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()
似乎无法做到这一点。