适用场景:你写的串口/网络服务进程挂了,需要自动拉起,不需要重启整个系统。
这是linux上最标准、最轻微的"看门狗"应用。
创建my-business.service服务
# /etc/systemd/system/my-business.service[Unit]Description=My Core Business ServiceAfter=network.target[Service]# 你的业务程序ExecStart=/usr/local/bin/my_app# 异常退出自动重启Restart=on-failureRestartSec=5s# 连续3次重启失败则认为不可恢复,停止尝试StartLimitBurst=3StartLimitInterval=60s# systemd 看门狗:10秒内没收到喂狗信号,强制重启WatchdogSec=10sType=notify[Install]WantedBy=multi-user.target在你的业务代码里配合喂狗(C语言示例):
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<sys/socket.h>#include<sys/un.h>voidsd_notify(constchar*message){constchar*socket_path=getenv("NOTIFY_SOCKET");if(!socket_path||strlen(socket_path)!=1||socket_path[0]!='@'){return;// 不是由 systemd 启动的,不喂狗}intfd=socket(AF_UNIX,SOCK_DGRAM,0);if(fd<0)return;structsockaddr_unaddr={0};addr.sun_family=AF_UNIX;addr.sun_path[0]='@';strncpy(addr.sun_path+1,socket_path+1,sizeof(addr.sun_path)-2);sendto(fd,message,strlen(message),0,(structsockaddr*)&addr,sizeof(addr));close(fd);}intmain(){// 告诉 systemd 准备好了,看门狗周期 10 秒sd_notify("READY=1\nWATCHDOG_USEC=10000000");while(1){// 你的业务代码sleep(1);// 喂狗sd_notify("WATCHDOG=1");}return0;}编译并部署:
gcc-omy_app my_app.ccpmy_app /usr/local/bin/chmod755/usr/local/bin/my_app systemctl daemon-reload systemctl start my-business模拟杀死应用
ps-ef|grepmy_appkill-923196观察my_app是否被重新拉起
ps-ef|grepmy_app