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

hit*_*lle 6 linux process

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

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

Cor*_*son 10

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

添加到/ etc/inittab的末尾:

x:3:respawn:/path/to/my/program
Run Code Online (Sandbox Code Playgroud)

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


Dam*_*mon 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);
}
Run Code Online (Sandbox Code Playgroud)

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

waitpid给定零标志,除正常或异常终止外,不会返回任何内容.如果进程正常退出,例如通过返回或调用WIFEXITED,true则会导致.如果进程正常退出(如因为你要求),一个很可能根本希望保留重新启动它,直到天的尽头!mainexit


Set*_*son 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
Run Code Online (Sandbox Code Playgroud)

您可以更花哨地尝试做看门狗的事情,以确保程序不仅存在,而且实际上正在运行。