事件驱动的linux进程监视器:怎么做?

时间:2012-06-26 09:21:04

标签: c linux

我有一个不稳定的程序,随机崩溃,我可以使用bash脚本来保持运行,但有没有办法监控它的状态?不是通过民意调查,而是通过事件驱动。

并且可选的问题是,如果监视进程不是它的父进程,这仍然可能吗?

5 个答案:

答案 0 :(得分:1)

是的,它仍然有可能。如果您想编写自己的应用程序来执行此操作,则必须使用ptrace。它允许您作为调试器附加到进程并等待某些事件。我描述了在我的博客上使用ptrace。在这里,您可以通过一些示例了解更多相关信息:http://purecode.pl/blog/?tag=ptrace

答案 1 :(得分:1)

你可以编写一个简单的包装器来解析和执行崩溃过程,并在它获得SIGCHLD并重新启动时醒来; 概念代码如下:

volatile sig_atomic_t gotchld = 0;

void
sigchld_handler(int sig)
{
    if (sig == SIGCHLD)
        gotchld = 1;
}

signal(SIGCHLD, sigchld_handler);

for (;;) {
    switch ((pid = fork()) {
    case -1:
        err(1, "fork");
    case 0:
        exec_my_crashy_program_here();
        errx(1, "came back from exec!");    /* paranoia */
    default:
        printf("sleeping for pid %u\n", pid);
        while (!gotchld)
            select(0, NULL, NULL, NULL, NULL);  /* sleep forever waiting for signal */
        /* possibly do fancy stuff with the wait() family of functions */
        gotchild = 0;
        continue;    
    }
}

您不需要任何花哨的东西,只需了解子和父进程如何通过信号进行交互的基本知识。

请注意,由于我直接处理了信号,所以已经有一段时间了,所以请仔细检查那里的代码是否正确。

答案 2 :(得分:0)

从您的问题中不清楚您是否正在尝试确保程序继续运行,或者您是否正在尝试调试它。

如果您要让它继续运行,请尝试Monit:http://mmonit.com/monit/

答案 3 :(得分:0)

您可以尝试使用inotify或类似服务并注意删除/ proc / PID吗?

答案 4 :(得分:0)

如果使用bash脚本启动进程,则 监视其状态:进程退出后脚本的执行将恢复,并获取退出代码。这是事件驱动的。

至于监控非子女程序,Yob和user1442158已经提出了合理的建议。