我已经创建了一个linux c ++服务(它基本上是一个应用程序,但它经常处理TCP / IP上的请求)。
我想知道是否有任何简单的方法让它“自动重启”如果出现问题(如崩溃)或服务器重启?
我不确定如何将其设置为服务或设置rc.d脚本,我不是100%熟悉w /如何在linux上执行此操作(我的服务器正在运行ubuntu如果重要的话。)
非常感谢任何建议!
~Josh
答案 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)
答案 3 :(得分:0)
您可能需要查看使用Inet Daemon。每当有新请求进入时,inet守护程序都会启动一个新进程。因此,如果服务器出现崩溃,它将在下一个请求进入时重新启动。
答案 4 :(得分:0)
在* NIX上编写自动重启子进程的父应用程序的最简单方法就是使用shell脚本:
#!/bin/sh
while true;
do
run_my_program;
done
您可以选择使用此重定向输出,在后台运行,等等。 这并不首先解决启动过程,但与在C ++中编写父进程相比,它的工作量更少(完全相同)。