优雅停止服务的核心是发送sigterm(15)信号,让进程执行清理、保存数据后再退出;默认不加参数的kill即发送该信号,需配合等待与状态检查,必要时才升级为kill -9。

Linux中用kill命令优雅停止服务,核心是发送SIGTERM信号(编号15),让进程有机会执行清理逻辑、保存数据、释放资源后再退出,而不是粗暴中断。
理解SIGTERM是默认且首选的终止信号
执行kill PID时,不加任何参数就等价于kill -15 PID或kill -SIGTERM PID。这是系统设计的“礼貌请求”——进程若注册了信号处理函数,就会响应这个信号,执行预设的关闭流程。
- Java应用通常监听SIGTERM,触发Spring Context关闭钩子,完成数据库连接释放、线程池停机等
- Nginx收到SIGTERM后会停止接受新连接,等待已有请求处理完毕再退出
- 数据库服务(如PostgreSQL)会完成当前事务、刷盘日志、安全关闭共享内存段
标准优雅停止操作流程
真实运维中不能只发一次信号就认为结束,需配合状态确认和超时机制:
- 第一步:发送SIGTERM,例如kill 12345
- 第二步:等待3–30秒(具体看服务复杂度),用ps -p 12345或kill -0 12345检查进程是否已退出
- 第三步:若进程仍在运行,说明它卡在清理阶段或未正确处理信号,此时才考虑升级为kill -9 12345
批量优雅停止同名服务
当有多个实例(如多个Java进程或Nginx worker)时,避免逐个查PID,改用pkill:
- pkill -f "java -jar app.jar" —— 按完整命令行匹配,更精准
- pkill -u www-data nginx —— 指定用户+进程名,防止误杀
- 不加-9即默认发送SIGTERM,符合优雅原则
验证服务是否真正支持优雅终止
不是所有程序都正确实现了SIGTERM处理。可通过以下方式快速判断:
- 启动服务后,在另一终端执行kill -0 PID确认存在,再执行kill PID
- 观察日志输出:正常应有“Shutting down”, “Gracefully stopping”, “Waiting for active requests…”等提示
- 检查临时文件、锁文件是否被清理;数据库连接数是否归零;端口是否释放(ss -tlnp | grep :8080)











