我们在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
您可以使用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
通常,他们必须互相投票。让它们互相发送信号零(这只是检查活动性并且不会中断其他程序)。
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)
您可以更花哨地尝试做看门狗的事情,以确保程序不仅存在,而且实际上正在运行。