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

时间:2011-06-30 17:17:39

标签: linux process

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

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

4 个答案:

答案 0 :(得分:10)

您可以使用init来监督该过程,并且由于init仅在重新启动时终止,因此您不需要“程序B”。

添加到/ etc / inittab的末尾:

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

有关语法和其他选项的信息,请参阅man inittab

答案 1 :(得分:6)

您可以使用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除了正常或异常终止之外不会返回任何内容。如果流程正常退出,WIFEXITED会产生true,例如从main返回或致电exit。如果流程正常退出(例如,因为您提出了要求),那么很可能希望继续重新启动它直到几天结束!

答案 2 :(得分:4)

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

答案 3 :(得分:2)

他们通常必须互相轮询。让他们互相发送信号零(只检查活动状态,不会中断其他程序)。

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

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