不影响现有正在运行的服务的前提下部署 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步:停止旧进程,启动新进程

现在进行快速切换。

  1. 停止手动运行的 nohup 进程 (使用第2步记下的 PID):

    sudo kill -9 12345
  2. 立即通过 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,以确保服务器重启后服务也能自动拉起。

  1. 编辑配置文件:

    sudo vim  /etc/supervisord.d/gps-ss8605.ini
  2. autostart=false 修改为 autostart=true

  3. 保存文件后,再次通知 Supervisor 更新配置:

    sudo supervisorctl reread
    sudo supervisorctl update

    这个操作不会重启正在运行的服务,只是更新了它的配置。

至此,已成功将手动运行的服务平滑地迁移到了 Supervisor 的守护之下,实现了自动重启和开机自启,并且整个过程对线上服务的影响降到了最低。

Comments