即使使用nohup,子进程也会被杀死

时间:2016-05-09 14:57:31

标签: python subprocess nohup

我正在使用$(document).ready(function() { $('.top-bar-section li.active:not(.has-form) a:not(.button)').click(function() { $("li.active ul.sub-menu.dropdown").hide(); }); $('.top-bar-section ul li').hover(function() { if($("li.active ul.sub-menu.dropdown").css("display", "none")){ $("li.active ul.sub-menu.dropdown").css("display", "block"); } }); }) 启动多个流程。

代码是这样的:

subprocess.Popen

while flag > 0: flag = check_flag() c = MyClass(num_process=10) c.launch() 如果类似以下内容:

MyClass

在大多数情况下,启动的子流程有时会在运行过程中死亡。在某些情况下,它完成了。

但是,如果我在while循环中直接使用MyClass(object) def __init__(self, num_process): self.num_process = num_process def launch(self): if self.check_something() < 10: for i in range(self.num_process): self.launch_subprocess() def launch_subprocess(self): subprocess.Popen(["nohup", "python", "/home/mypythonfile.py"], stdout=open('/dev/null', 'w'), stderr=open('logfile.log', 'w'), shell=False) ,则该过程会继续并及时完成。

有人能告诉我如何通过上述方式使用子进程来让后台运行进程?

1 个答案:

答案 0 :(得分:4)

当主进程正常退出时,nohup仅停止SIGHUP信号。对于SIGINT或SIGTERM等其他信号,子进程接收与父进程相同的信号,因为它位于同一进程组中。使用Popen的preexec_fn参数有两种方法。

设置子进程组:

subprocess.Popen(['nohup', 'python', '/home/mypythonfile.py'],
                 stdout=open('/dev/null', 'w'),
                 stderr=open('logfile.log', 'a'),
                 preexec_fn=os.setpgrp )

更多信息在另一个post中。

使子进程忽略这些信号:

def preexec_function():
    signal.signal(signal.SIGINT, signal.SIG_IGN)
subprocess.Popen( ... , preexec_fn=preexec_function)