用C崩溃后监视并自动重启另一个程序

JB0*_*2D1 0 c segmentation-fault application-restart ubuntu-12.04

我一直在运行的应用程序(用C++编写)自上次更新后随机崩溃,但在崩溃之间它运行良好,所以我想让它继续运行.它与segfault崩溃.我尝试编写一个这样的简单C程序:

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

当被调用的程序段错误时,我的程序似乎停止了.会execsystem(或其他)电话是一个更好的选择popen吗?在我的谷歌冒险中,我已经阅读了(并考虑尝试)daemontools监督,但我没有任何经验,似乎它应该是一个相对简单的事情使用C然后在这里我问这样的问题所以也许不是......在这一点上,它比真正试图保持程序运行更有好奇心,因为有现成的工具来完成它.

在使用C的Ubuntu 12.04计算机上重启程序崩溃的程序有什么简单可靠的方法?假设program_is_running()返回0false,PID 返回true.

MBl*_*anc 5

您可以使用像答案中的简单shell脚本来运行程序.

如果您坚持使用C,则可以使用组合fork,exec*并使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 */
    }
}
Run Code Online (Sandbox Code Playgroud)