0

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

还有一个可选问题,如果监控进程不是它的父进程怎么办,这还有可能吗?

4

5 回答 5

1

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

于 2012-06-26T09:23:20.810 回答
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;    
    }
}

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

还请考虑到我已经有一段时间没有直接处理信号了,所以请仔细检查那里的代码是否正确。

于 2012-06-26T09:57:40.823 回答
0

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

如果您想保持它运行,请尝试 Monit: http: //mmonit.com/monit/

于 2012-06-26T09:23:53.797 回答
0

您可以尝试 inotify 或类似的服务并观察 /proc/PID 是否被删除?

于 2012-06-26T09:25:06.560 回答
0

如果您使用 bash 脚本启动进程,它监视其状态:在进程退出后继续执行脚本,并获取退出代码。那是事件驱动的。

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

于 2012-06-26T09:29:58.617 回答