如何保护我的进程不被杀害?

我们在Linux上有一个关键任务服务器程序,我们不希望别人意外终止它。 如果有人终止它或崩溃,我们希望它重新启动。

所以我们打算另外编写一个程序,比如程序B.我们希望程序B和服务器程序互相保护。 如果我们的服务器程序退出,程序B将重新启动它。 如果程序B终止,服务器程序将再次启动它。 但是我们没有一个好的机制来让程序B和服务器程序在对方退出时得到通知。

Solutions Collecting From Web of "如何保护我的进程不被杀害?"

您可以使用init来保存进程,由于init只在重新启动时终止,所以不需要“程序B”。

添加到/ etc / inittab的末尾:

x:3:respawn:/path/to/my/program 

有关语法和其他选项的信息可以在man inittab找到

http://supervisord.org/这样的系统会不会为你准备好吗? 我们有主管监督几个过程,我可以证明它的功能。 它是非常好的,如果它将适用于您的应用程序。

您可以使用fork 从内部重新启动服务器。 哦,Unix的美丽。

就像是:

 int result = fork(); if(result == 0) Doserver(); if(result < 0) { perror(); exit(1); } for(;;) { int status = 0; waitpid(-1, &status, 0); if(!WIFEXITED(status)) { result = fork(); if(result == 0) Doserver(); if(result < 0) { puts("uh... crashed and cannot restart"); exit(1); } } else exit(0); } 

编辑:
使用WIFEXITED宏作为测试条件可能是明智的,它更简洁和便携(相应地更改了代码)。 另外,它适合模拟我们可能想要的语义。

waitpid ,给零标志,将不会返回任何东西,但正常或异常终止。 如果进程正常退出,例如从main返回或调用exit ,则WIFEXITED结果为true 。 如果进程正常退出(例如,因为你要求),一个很可能不想重新启动它,直到天的结束!

他们将不得不相互轮询,通常。 让他们互相发送信号零(这只是检查活力,不会中断其他程序)。

 echo $$>$1 read otherpid < $2 while :; do while kill -0 $otherpid do sleep 1 done # restart other program # (really restarting myself in my peer configuration) $0 $2 $1 & newpid=0 while [ "$newpid" -eq "$otherpid" ] do sleep 2 read newpid < $2 done otherpid=$newpid done 

你可以更加花哨,并尝试做看门狗的东西,以确保该程序不仅存在,但实际上运行。