我们在Linux之上有一个任务关键型服务器程序,我们不希望其他人意外终止它。如果有人终止它或它崩溃了,我们希望它重新启动。
所以我们计划编写另一个程序,比如程序B.我们希望程序B和服务器程序相互保护。如果我们的服务器程序退出,程序B将重新启动它。如果程序B终止,服务器程序将再次启动它。但是我们没有一个好的机制可以让程序B和服务器程序在它的对等体退出时得到通知。
答案 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
你可以更加花哨,并尝试做看门狗的东西,以确保程序不仅存在,而且实际上正在运行。