如何知道进程在unix中何时被终止
我正在从事一个Spark项目,该项目有一个可执行文件,在后台启动进程,现在我需要知道进程何时通过Bash终止。我得到的唯一解决方案是通过grep in loop不断检查其PID存在性(如果存在或不存在),是否有任何其他可能的解决方案可以做到这一点而无需循环。如何知道进程在unix中何时被终止,unix,ubuntu,Unix,Ubuntu,我正在从事一个Spark项目,该项目有一个可执行文件,在后台启动进程,现在我需要知道进程何时通过Bash终止。我得到的唯一解决方案是通过grep in loop不断检查其PID存在性(如果存在或不存在),是否有任何其他可能的解决方案可以做到这一点而无需循环。 我也尝试过处理退出代码,但是如果进程运行,并且只有在终止时才更改退出代码,则退出代码为0,这需要持续检查。可能需要更多的上下文。。。如果您的可执行文件正在启动进程,那么肯定有一种方法可以在执行过程中获取或保留句柄 在php中有proc_op
我也尝试过处理退出代码,但是如果进程运行,并且只有在终止时才更改退出代码,则退出代码为0,这需要持续检查。可能需要更多的上下文。。。如果您的可执行文件正在启动进程,那么肯定有一种方法可以在执行过程中获取或保留句柄 在php中有proc_open(),在Qt中有QProcess类,在c/c++中有popen()
许多语言都有此功能,但如果没有更多细节,很难提供解决方案。如果我理解正确,情况如下: 您的可执行文件在某个地方执行fork,并在另一个进程中运行另一个逻辑,您希望主进程得到fork进程是否仍在运行的通知 为了回答这个问题,我将确保我们都熟悉相同的术语: 主进程(运行可执行文件时)称为父进程 父进程启动的进程称为子进程 现在,当子进程死亡时,一个信号
SIGCHLD
被发送到父进程,通常SIGCHLD
被映射到SIG_-DFL
,这实际上是SIGCHLD
的信号。用人类的话来说,这意味着如果子进程死亡,那么父进程就不会大便
但是,如果希望获得通知,则可以更改发送SIGCHLD
时发生的行为。为此,您必须实现信号处理程序
功能:
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...
}
}
然后,您必须声明希望我们的自定义\u sigchld\u处理程序处理sigchld
信号:
struct sigaction signal_action = {0};
signal_action.sa_handler = custom_sigchld_handler;
sigaction(SIGCHLD, &signal_action, NULL);
你在用什么编程语言?请将您的问题包括在可执行文件中的相关源代码中,这样我们就有了改进它的起点。我也这么想,但由于他正在修改pid,我们不能假设这是一个fork或甚至是一个system()调用,或者就这一点而言,它甚至是在C:)