最稳妥的退出方式是用kill或killall发送sigterm(信号15),前提是进程支持优雅关闭:它会先保存状态、释放资源、关闭连接再退出,避免数据丢失;kill适用于已知pid的精准终止,killall适用于按进程名批量终止,二者默认均发送sigterm。

直接用 kill 或 killall 发送 SIGTERM(信号15)是最稳妥的退出方式,前提是进程本身支持优雅关闭——它会先保存状态、释放资源、关闭连接,再退出,避免数据丢失或服务中断。
用 kill 发送 SIGTERM(需已知 PID)
这是最精确的方式,适合你已经知道目标进程 ID 的情况。默认行为就是发 SIGTERM,无需额外参数:
- 查 PID:比如查 nginx 主进程,运行
pgrep -f "nginx: master process"或pidof nginx - 发送信号:
kill 1234(假设 1234 是 PID),等同于kill -15 1234或kill -TERM 1234 - 验证是否退出:可用
ps -p 1234检查进程是否还在;若几秒后仍存在,说明它正在清理,可稍等或检查日志
用 killall 发送 SIGTERM(按进程名批量操作)
适合终止所有同名进程,比如重启全部 Python Web 服务实例:
- 基础用法:
killall nginx—— 默认即发 SIGTERM 给所有名为 nginx 的进程 - 加交互确认更安全:
killall -i nginx,每杀一个都会问“Really kill nginx(1234)? (y/N)” - 匹配完整命令行(防误杀):
killall -e python3只匹配命令名为 python3 的进程,不匹配 python3 app.py 这类带参数的(后者可能需用pkill -f "python3 app.py")
判断是否真正“优雅”退出的关键点
SIGTERM 是否生效,不取决于命令本身,而取决于进程是否捕获并正确处理该信号:
- 主流服务(如 nginx、redis、apache)都内置 SIGTERM 处理逻辑,会执行 graceful shutdown
- 自研程序若未注册 SIGTERM handler,可能直接退出——这时需修改代码,用
signal(SIGTERM, cleanup_and_exit)等方式响应 - 如果发完 SIGTERM 后进程长时间不退出(比如卡在 I/O 或死锁),才考虑降级使用
kill -9,但这是最后手段
实用小技巧:先试信号,再看效果
别一上来就强制杀,养成“观察→发 TERM→等待→再判断”的习惯:
- 查进程状态:
ps -o pid,comm,etime,state -C nginx看运行时长和状态(R/S/Z) - 看是否响应信号:
kill -0 1234不发信号,只检测进程是否存在且可通信(返回 0 表示正常) - 查进程收到的信号:
cat /proc/1234/status | grep SigQ(部分内核版本支持),或结合strace -p 1234观察信号接收











