我正在开发一个Spark项目,它有一个可执行文件,可以在后台启动进程,现在我需要知道进程何时被Bash杀死。我得到的唯一解决方案是通过grep in循环连续检查它的PID存在如果存在或不存在,是否有任何其他可能的解决方案,没有循环。 我也尝试过处理退出代码,但是如果进程运行则退出代码为0,并且只有在它被杀死时才会更改,需要连续检查
答案 0 :(得分:1)
如果我理解正确,情况是这样的:
您的可执行文件在某个地方fork
执行并在另一个进程中运行另一个逻辑,并且您希望主进程获知是否分叉进程仍在运行。
为了回答我会确保我们都熟悉相同的术语:
主要流程(运行可执行文件时)称为父流程。
父流程启动的流程称为子流程。
现在,当子流程消失时,信号SIGCHLD
会发送到父流程,通常SIGCHLD
会映射到SIG_DFL
} SIG_IGN
实际上是SIGCHLD
。用人的话来说,这意味着如果子进程死亡,父进程就不会产生麻烦。
但是,如果您想获得通知,您可以更改发送SIGCHLD
时发生的行为。为此,您必须实现signal handler
功能:
void custom_sigchld_handler(int sig)
{
pid_t p;
int status;
while ((p = waitpid(-1, &status, WNOHANG)) != -1)
{
// If you got here it means p is a dead process. Do your logic here...
}
}
然后您必须声明您希望custom_sigchld_handler
处理SIGCHLD
信号:
struct sigaction signal_action = {0};
signal_action.sa_handler = custom_sigchld_handler;
sigaction(SIGCHLD, &signal_action, NULL);
答案 1 :(得分:0)
可能需要更多上下文...如果您的可执行文件正在启动该过程,那么在执行时肯定有办法获取或保持它。
在php中,有proc_open(),在Qt中有QProcess类,在c / c ++中,有popen()
许多语言都有此功能,但没有更多细节,很难提供解决方案。