【问题标题】:Monitor and automatically restart another program after crash with C使用 C 监控并在崩溃后自动重新启动另一个程序
【发布时间】:2014-02-16 04:12:08
【问题描述】:

自上次更新以来,我一直在运行的应用程序(用 C++ 编写)随机崩溃,但在两次崩溃之间它运行良好,所以我想保持它运行。它因段错误而崩溃。我试着写一个像这样的简单 C 程序:

while (1) {
    if (!program_is_running()) {
        fp = popen("/usr/bin/program", "r");
        fclose(fp);
    }
    else
        sleep(15);
}

当被调用程序出现段错误时,我的程序似乎停止了。 execsystem(或其他)调用会比 popen 更好吗?在我的谷歌冒险中,我读过(并考虑过尝试)daemontools supervise,但我对此没有任何经验,而且使用 C 似乎应该是一个相对简单的问题,但是我在这里问这个问题也许不是......在这一点上,它比真正试图保持程序运行更令人好奇,因为有现成的工具来完成它。

在使用 C 的 Ubuntu 12.04 机器上重新启动因分段错误而崩溃的程序的简单而可靠的方法是什么?假设 program_is_running() 返回 0 为假,PID 为真。

【问题讨论】:

  • 首先保证程序不崩溃会不会更好
  • @EdHeal 同意。如果我是相关程序的开发者,我不会在它准备好进入黄金时段之前发布它。但是,唉,我们到了

标签: c segmentation-fault ubuntu-12.04 application-restart


【解决方案1】:

您可以使用简单的 shell 脚本保持程序运行,例如 this 答案中的那个。

如果你坚持使用C,你可以使用forkexec*waitpid的组合来保持一个进程无限期地运行。尝试类似(未经测试):

while (1) {
    int status;
    pid_t pid = fork();
    if (-1 == pid) { perror("fork failed!"); exit(EXIT_FAILURE); }

    if (0  == pid) {
        /* Child */
        execlp("/usr/bin/program", NULL);
        perror("execlp failed!");
        exit(EXIT_FAILURE);
    }

    waitpid(pid, &status, 0);
    if (!WIFSIGNALED(status) || WTERMSIG(status) != SIGSEGV) {
        exit(EXIT_SUCCESS);
        /* The process didn't die because of a SIGSEGV, lets keep it dead */
    }
}

【讨论】:

  • 是的,bash 方式要容易得多。谢谢
  • 为什么使用幻数11 代替signal.h 中的SIGSEGV 来代替sig?
  • 我在想kill(1) 的条款。感谢您指出这一点,我已经更新了答案。谢谢帕特!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多