让系统产生的subprocess()在父进程终止后继续运行并退出

在Linux / C ++库中,我正在通过system()调用启动一个进程

system("nohup processName > /dev/null&"); 

这似乎工作正常与一个简单的testing应用程序,它自己退出,但如果我从一个Nodejs / V8扩展中获取一个杀手信号使用此,subprocess被杀害。 我确实发现跑步,

 system("sudo nohup processName > /dev/null&"); 

在sudoers文件设置为不需要密码的情况下,即使在父进程(节点)退出的情况下,也可以使其运行。 有没有办法完全分离subprocess,所以发送给父母和父母的信号对孩子已经没有影响了? 最好在system()调用中,而不是需要获取进程ID和做某事的东西。

Solutions Collecting From Web of "让系统产生的subprocess()在父进程终止后继续运行并退出"

从父进程分离的过程很简单:在setsid下运行该命令(以便在新会话中启动),将标准输入,输出和错误重定向到/dev/null (或其他适当的地方)一个子shell。 因为system()启动一个新的shell,所以相当于这样一个子shell

 system("setsid COMMAND </dev/null >/dev/null 2>/dev/null &"); 

确实需要什么。 在shell脚本中,等价的是

 ( setsid COMMAND </dev/null >/dev/null 2>/dev/null & ) 

(Shell脚本需要一个子shell,因为否则COMMAND将在当前shell的作业控制之下,这在使用system()时并不重要,因为无论如何,它都会为命令启动一个新的shell;当命令退出。)

重定向是必要的,以确保COMMAND没有对当前终端的开放描述符。 (当终端关闭时,TERM信号被发送到所有这些进程。)这意味着标准输入,标准输出和标准错误都必须重定向。 上述重定向工作在Bash和POSIX shell中,但在古代版本的/bin/sh可能不起作用。 特别是,它应该在所有的Linux发行版中工作。

setsid启动一个新的会话; COMMAND成为其自己的过程组的过程组领导。 信号可以指向单个进程,也可以指向进程组中的所有进程。 终止信号通常发送到整个过程组(因为应用程序在技术上可能由多个相关过程组成)。 开始一个新的会话可以确保COMMAND不会被杀死,如果父进程所属的进程组被一个进程组信号所杀死的话。

我的猜测是整个过程组正在被杀死。 你可以尝试setpgid在孩子开始一个新的进程组。 第一步应该是摆脱system ,使用forkexecveposix_spawn