不影响现有正在运行的服务的前提下部署 Supervisor
阶段一:准备工作 (对现有服务完全无影响)
在这个阶段,安装并配置好 Supervisor,但先不让它启动服务。
第1步:安装 Supervisor
如果还未安装,请先安装 Supervisor。
# Debian/Ubuntu
sudo apt-get update && sudo apt-get install supervisor -y
# CentOS/RHEL
sudo yum install epel-release -y && sudo yum install supervisor -y安装后,检查 supervisord 服务的状态,并启动它。
# 检查状态
sudo systemctl status supervisord
# 如果状态是 inactive (dead) 或 failed,就启动它
sudo systemctl start supervisord
# 建议设置为开机自启
sudo systemctl enable supervisord此时还没有管理 .NET 应用。
第2步:获取现有进程的 PID
需要准确知道当前正在运行的 nohup 进程的 ID,以便在最后一步精确地停止。
netstat -tunlp | grep 8605会看到类似这样的输出:
tcp 0 0 0.0.0.0:8605 0.0.0.0:* LISTEN 31507/dotnet8.0 31507就是正在运行的服务的进程ID (PID)。请记下这个 PID,在最后一步会用到。
第3步:创建 Supervisor 配置文件 (关键步骤)
现在,为网关服务创建一个 Supervisor 配置文件。
sudo vim /etc/supervisord.d/gps-ss8605.ini将以下配置粘贴进去。请注意,暂时将 autostart 设置为 false,这是实现平滑过渡的关键。
[program:gps-ss8605]
; 对应命令: dotnet8.0 Gateway.SocketService.dll
command=/usr/bin/dotnet8.0 Gateway.SocketService.dll ; 建议使用 dotnet 的完整路径 (用 whereis dotnet8.0 查找)
; 对应命令: cd /mnt/gps/ss8505
directory=/mnt/gps/ss8505
; [关键] 暂时设置为 false
; 这可以防止 Supervisor 在加载配置后立即尝试启动应用
; 因为旧进程仍在运行,端口会被占用,立即启动会失败
autostart=false
; 进程守护的核心配置 (切换成功后会生效)
autorestart=true
user=gpsuser ; [重要] 请替换为上一步找到的实际运行用户
stopsignal=INT
; 日志配置
stdout_logfile=/var/log/supervisor/gps-ss8605-stdout.log
stderr_logfile=/var/log/supervisor/gps-ss8605-stderr.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=10
stderr_logfile_maxbytes=50MB
stderr_logfile_backups=10在保存前,请确认:
command中的dotnet路径最好是绝对路径 (通过whereis dotnet8.0查找)。user已被替换为服务实际运行的用户名 (从第2步的ps命令结果中可以看到)。创建日志目录并授权:
sudo mkdir -p /var/log/supervisor/ sudo chown gpsuser:gpsuser /var/log/supervisor/ -R # 将 gpsuser 替换为实际用户名
第4步:让 Supervisor 加载配置
现在,让 Supervisor 读取刚刚创建的配置文件。
sudo supervisorctl reread
sudo supervisorctl update
```
运行后,可以检查状态:
```bash
sudo supervisorctl status会看到 gps-ss8605 处于 STOPPED 状态。这是完全正常的,因为设置了 autostart=false。至此,所有准备工作完成,线上服务仍在正常运行。
阶段二:执行切换 (服务中断约5秒)
这是唯一会产生服务中断的阶段,操作非常快。
第5步:停止旧进程,启动新进程
现在进行快速切换。
停止手动运行的
nohup进程 (使用第2步记下的 PID):sudo kill -9 12345立即通过 Supervisor 启动新进程:
sudo supervisorctl start gps-ss8605
第6步:验证服务
检查服务是否已由 Supervisor 成功启动:
sudo supervisorctl status应该会看到 gps-gateway 的状态是 RUNNING。同时,也可以通过业务功能测试来确认服务是否恢复正常。
还可以实时查看日志来确认应用是否正常启动:
sudo supervisorctl tail -f gps-ss8605 stdout阶段三:最终配置 (切换成功后)
第7步:启用开机自启
确认服务在 Supervisor 管理下运行稳定后,需要把 autostart 改回 true,以确保服务器重启后服务也能自动拉起。
编辑配置文件:
sudo vim /etc/supervisord.d/gps-ss8605.ini将
autostart=false修改为autostart=true。保存文件后,再次通知 Supervisor 更新配置:
sudo supervisorctl reread sudo supervisorctl update这个操作不会重启正在运行的服务,只是更新了它的配置。
至此,已成功将手动运行的服务平滑地迁移到了 Supervisor 的守护之下,实现了自动重启和开机自启,并且整个过程对线上服务的影响降到了最低。
Comments