在 Linux/C++ 库中,我通过 system() 调用启动一个进程,
system("nohup processName > /dev/null&");
这似乎适用于一个自行退出的简单测试应用程序,但如果我从获取终止信号的 Nodejs/V8 扩展内部使用它,子进程将被终止。我确实发现在运行,
system("sudo nohup processName > /dev/null&");
通过将 sudoers 文件设置为不需要密码,即使父进程( Node )退出也能成功运行。有没有办法完全分 ionic 进程,以便发送给父进程和父进程退出的信号不再对子进程产生影响?最好在 system() 调用中,而不是需要获取进程 ID 并对其执行某些操作的东西。
最佳答案
从父进程分离的过程很简单:在setsid
下运行命令(因此它在一个新 session 中启动),将标准输入、输出和错误重定向到/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;当命令退出时 shell 将退出。)
重定向是确保 COMMAND
没有打开当前终端的描述符所必需的。 (当终端关闭时,一个 TERM 信号被发送到所有这些进程。)这意味着标准输入、标准输出和标准错误都必须重定向。上述重定向在 Bash 和 POSIX shell 中都有效,但在旧版本的 /bin/sh
中可能无效。特别是,它应该适用于所有 Linux 发行版。
setsid
开始一个新的 session ; COMMAND
成为它自己的进程组的进程组组长。信号可以指向单个进程,也可以指向进程组中的所有进程。终止信号通常被发送到整个进程组(因为应用程序在技术上可能由多个相关进程组成)。如果父进程所属的进程组被进程组范围内的信号杀死,则启动新 session 可确保 COMMAND
不会被杀死。
关于c++ - 使 system() 产生的子进程在父进程收到终止信号并退出后继续运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12945189/