Linux自定义服务响应Stop指令需捕获SIGTERM信号:注册sigaction处理函数,仅调用异步信号安全函数,执行关闭套接字、等待请求完成、刷新日志等优雅退出逻辑,并在systemd单元文件中配置Type=simple、TimeoutStopSec等参数。

Linux中让自定义服务响应Stop指令,核心是正确捕获并处理 SIGTERM(信号15)——这是系统服务管理器(如systemd、SysV init)在执行 systemctl stop 或 service xxx stop 时默认发送的信号。
注册SIGTERM处理函数
服务进程需在启动时主动注册信号处理器,接管默认终止行为。关键点包括:
- 使用
signal()或更安全的sigaction()注册回调函数,不能依赖默认终止动作 - 处理函数内应只调用异步信号安全函数(如
write()、_exit()),避免printf()、malloc()等不可重入操作 - 完成清理后建议调用
_exit()而非exit(),防止二次触发清理逻辑
实现优雅退出逻辑
收到SIGTERM后,服务不应立即退出,而要完成必要收尾:
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- 关闭监听套接字,拒绝新连接
- 等待正在处理的请求完成(可设超时,如30秒)
- 刷新日志缓冲区、保存运行状态或临时数据
- 释放共享内存、删除临时文件、通知子进程退出
避免常见陷阱
很多服务无法正常Stop,往往源于以下疏漏:
- 未屏蔽信号:主循环中若调用阻塞式系统调用(如
accept()、read()),可能延迟响应;建议设置SA_RESTART标志或检查返回值是否为EINTR - 忽略SIGINT:本地测试时按Ctrl+C也应触发相同退出流程,便于调试
- 多线程环境:信号由内核递送给任意一个未阻塞该信号的线程,建议在主线程统一处理,其他线程阻塞所有信号
- 未处理SIGCHLD:若服务派生子进程,需处理该信号防止僵尸进程影响Stop流程
配合系统服务管理器
确保服务单元文件(如 .service)配置合理:
-
Type=simple时,进程主PID必须是启动命令的直接子进程 -
ExecStop=不必手动写 kill 命令,只要进程已注册SIGTERM,systemd会自动发送 - 添加
TimeoutStopSec=60给足清理时间,避免被强制发送SIGKILL - 启用
Restart=on-failure时,注意区分正常退出(exit code 0)与异常终止

















