ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

看门狗实战场景一:用 systemd 守护你的业务进程(最常用)

看门狗实战场景一:用 systemd 守护你的业务进程(最常用) 适用场景你写的串口/网络服务进程挂了需要自动拉起不需要重启整个系统。这是linux上最标准、最轻微的看门狗应用。创建my-business.service服务# /etc/systemd/system/my-business.service[Unit]DescriptionMy Core Business ServiceAfternetwork.target[Service]# 你的业务程序ExecStart/usr/local/bin/my_app# 异常退出自动重启Restarton-failureRestartSec5s# 连续3次重启失败则认为不可恢复停止尝试StartLimitBurst3StartLimitInterval60s# systemd 看门狗10秒内没收到喂狗信号强制重启WatchdogSec10sTypenotify[Install]WantedBymulti-user.target在你的业务代码里配合喂狗C语言示例#includestdio.h#includestdlib.h#includestring.h#includeunistd.h#includesys/socket.h#includesys/un.hvoidsd_notify(constchar*message){constchar*socket_pathgetenv(NOTIFY_SOCKET);if(!socket_path||strlen(socket_path)!1||socket_path[0]!){return;// 不是由 systemd 启动的不喂狗}intfdsocket(AF_UNIX,SOCK_DGRAM,0);if(fd0)return;structsockaddr_unaddr{0};addr.sun_familyAF_UNIX;addr.sun_path[0];strncpy(addr.sun_path1,socket_path1,sizeof(addr.sun_path)-2);sendto(fd,message,strlen(message),0,(structsockaddr*)addr,sizeof(addr));close(fd);}intmain(){// 告诉 systemd 准备好了看门狗周期 10 秒sd_notify(READY1\nWATCHDOG_USEC10000000);while(1){// 你的业务代码sleep(1);// 喂狗sd_notify(WATCHDOG1);}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
返回列表