C ++ Linux服务 - 如何使用init.d +自动重启?

时间:2012-08-03 13:40:24

标签: c++ linux

我已经创建了一个linux c ++服务(它基本上是一个应用程序,但它经常处理TCP / IP上的请求)。

我想知道是否有任何简单的方法让它“自动重启”如果出现问题(如崩溃)或服务器重启?

我不确定如何将其设置为服务或设置rc.d脚本,我不是100%熟悉w /如何在linux上执行此操作(我的服务器正在运行ubuntu如果重要的话。)

非常感谢任何建议!

~Josh

5 个答案:

答案 0 :(得分:4)

在我的产品中,我创建了看门狗进程,它在单独的进程中分叉和执行服务进程,并等待终止。如果由于某种原因,进程终止,看门狗进程将创建另一个线程,它将再次开始处理。

如评论中所述,您应该检查它崩溃的原因。首先,您可以阅读程序退出值。

这是一个简单的程序,可以帮助您入门:

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main()
{
    create_process();
    return 0;
}

void create_process()
{
    int exit_code;
    if(fork() == 0)
    {
        exec("./your_service");
    }
    else
    {
        wait(&exit_code);
        if(WIFEXITED(exit_code))
        {
            /* Program terminated with exit */
            /* If you want, you could decode exit code here using
               WEXITSTATUS and you can start program again.
            */
            return;
        }
        else
`       {
                /* Program didn't terminated with exit, restart */
            create_process();
        }

    }
}

要在系统启动时启动服务,只需编辑/etc/rc.local脚本并附加命令即可运行监视程序进程。

答案 1 :(得分:4)

这里有很多答案建议使用“父应用程序”来完成它,但你最终会遇到与父应用程序相同的问题 - 它一直是乌龟。

在许多unix类型系统中(特别是在历史上),init进程是第一个执行并将执行(并自动重启)进程的进程,如/ etc / inittab中所定义。

因此,不是将自己的看门狗或进程编写为自动重启 - 您可以使用这个自动重启的工具,因为它是init进程,如果它死了,系统还有很多需要担心的事情。比你的服务。

如果您的服务应该为每个传入连接生成一个新进程,并且只有在有传入连接的情况下才能正常工作,那么@doron建议采用另一种好的方法。

最后,最近,init进程(和/ etc / inittab)已经在具有upstart的Ubuntu类型系统上被替换 - http://upstart.ubuntu.com/ - 这是一个更灵活的系统。

答案 2 :(得分:3)

  • 创建一个控制应用程序,如有必要,启动并重新启动它。
  • 在你的应用程序中执行此操作 - 分叉一个孩子,在那里运行程序,捕获停止/崩溃并在必要时分叉新孩子。可以在此处找到一些工作代码:monitoring the main app in c

答案 3 :(得分:0)

您可能需要查看使用Inet Daemon。每当有新请求进入时,inet守护程序都会启动一个新进程。因此,如果服务器出现崩溃,它将在下一个请求进入时重新启动。

答案 4 :(得分:0)

在* NIX上编写自动重启子进程的父应用程序的最简单方法就是使用shell脚本:

#!/bin/sh
while true;
do
    run_my_program;
done

您可以选择使用此重定向输出,在后台运行,等等。 这并不首先解决启动过程,但与在C ++中编写父进程相比,它的工作量更少(完全相同)。