如何知道进程在unix中被杀死的时间

时间:2016-09-10 12:39:06

标签: unix ubuntu

我正在开发一个Spark项目,它有一个可执行文件,可以在后台启动进程,现在我需要知道进程何时被Bash杀死。我得到的唯一解决方案是通过grep in循环连续检查它的PID存在如果存在或不存在,是否有任何其他可能的解决方案,没有循环。 我也尝试过处理退出代码,但是如果进程运行则退出代码为0,并且只有在它被杀死时才会更改,需要连续检查

2 个答案:

答案 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()

许多语言都有此功能,但没有更多细节,很难提供解决方案。

相关问题