在 Linux 中监视和终止其他程序停滞进程的更好方法?

Better way to monitor and kill other program's stalled process in linux?

本文关键字:进程 停滞 更好 方法 程序 其他 Linux 监视 终止      更新时间:2023-10-16

我需要我的程序运行其他程序,但如果另一个程序在某个时间限制内没有返回,我需要杀死它。我想出了以下似乎有效的解决方案。

int main()
{
int retval, timeout=10;
pid_t proc1=fork();
if(proc1>0)
{
    while(timeout)
    {
        waitpid(proc1, &retval, WNOHANG);
        if(WIFEXITED(retval)) break; //normal termination
        sleep(1);
        --timeout;
        if(timeout==0)
        {
            printf("attempt to kill processn");
            kill(proc1, SIGTERM);
            break;
        }
    }
}
else if(proc1==0)
{
    execlp("./someprogram", "./someprogram", "-a", "-b", NULL);
}
//else if fork failed etc.
return 0;
}

我需要我的程序尽可能健壮,但我是 linux 编程的新手,所以我可能不知道它可能出现的问题。我的问题是:1.这是解决此特定问题的正确方法还是有更好的方法?2.是否有人看到可能导致意外行为或系统资源泄漏的可能问题或错误?

如果程序被信号杀死(包括由于违反分段而导致的崩溃),(WIFEXITED(retval))不会返回true。

可能最好只是检查是否从waitpid成功返回。只有当程序终止(无论是否自愿)时,才会发生这种情况。

取决于确保该过程消失的重要性......
SIGTERM杀死这个过程后,你可以再睡一秒钟左右,如果它仍然没有消失,请使用SIGKILL来确定。