优雅重启核心是旧进程收尾、新进程接手:先发sigterm让其停止新连接并释放资源,等待5–10秒确认退出及端口释放后启动;推荐用systemd管理,支持自动信号处理与超时控制。

优雅重启一个运行中的进程,核心是“不硬杀、不丢连接、不占资源”,重点在于让旧进程有时间收尾,新进程干净接手。
先发 SIGTERM,给进程自我清理的机会
大多数正规服务(如 Nginx、Gradio、自研 Go/Python Web 服务)都支持 SIGTERM 信号。它不是强制终止,而是通知进程:“请准备退出”。进程收到后通常会:
- 停止接受新连接
- 释放端口和文件锁
- 清空缓存、保存中间状态
- 等待已有请求处理完成
执行方式:
PID=$(ps aux | grep 'run.sh' | grep -v grep | awk '{print $2}') && kill $PID
等 5–10 秒再检查是否退出:kill -0 $PID 2>/dev/null || echo "已退出"
确认端口和资源已释放再启动
直接重跑脚本却报 Address already in use,大概率是旧进程没真正退出,或端口被残留子进程占用。重启前务必验证:
- 查端口占用:lsof -i :8080 或 netstat -tuln | grep :8080
- 查残留进程:ps aux | grep run.sh(注意排除 grep 自身)
- 删临时文件(如有):rm -f /tmp/*.lock /tmp/gradio_*.log
全部清空后再执行 bash run.sh 或对应启动命令。
用 systemd 管理更省心(推荐长期部署)
如果服务常驻运行,别再手动启停。写个 systemd 服务单元文件(如 /etc/systemd/system/cartoon-ui.service),内容包含:
ExecStart=/bin/bash /root/run.sh
Restart=on-failure
RestartSec=5
KillSignal=SIGTERM
TimeoutStopSec=15
启用后,只需一条命令:sudo systemctl restart cartoon-ui,systemd 会自动处理信号、超时、日志和依赖。
对支持热重载的服务,优先 reload 而非 restart
像 Nginx、Apache、rsyslog 这类服务,配置变更后无需重启整个进程,用 systemctl reload nginx 即可平滑更新配置,连接不断、服务不抖。
判断是否支持:systemctl show nginx | grep -i reload,有输出即支持。











