将supervisor迁移到systemd

历史问题

在前systemd时代,要配置一个启动运行的服务还是比较麻烦的,所以才有了supervisor这种服务,但是现在systemd已经很成熟了,不再需要多此一举:

systemd启动supervisord,supervisord再来启动自定义服务

是时候把supervisor的服务迁移到systemd下了。

转换配置文件

首先是把/etc/supervisor/conf.d/下面的服务配置文件改成systemd格式的,然后放到/etc/systemd/system/下。

转换对照表如下:

Supervisor 指令 systemd 指令 说明
command ExecStart 运行程序的完整路径和参数
directory WorkingDirectory 程序运行的起始目录
user User 运行该服务的用户
environment Environment 环境变量设置
autostart WantedBy=multi-user.target 是否随系统启动
autorestart Restart=always 进程退出后是否自动重启
stdout_logfile StandardOutput 标准输出(通常交给 journald)
stderr_logfile StandardError 标准错误输出

一个典型的systemd服务单元配置如下:

[Unit]
Description=My Python Application
After=network.target

[Service]
# 基础配置
User=www-data
Group=www-data
WorkingDirectory=/var/www

# 环境变量 (注意语法:空格分隔或多次声明)
Environment=NODE_ENV=production
Environment=PORT=8080

# 启动命令 (必须使用绝对路径)
ExecStart=/usr/bin/python3 /var/www/app.py

# 重启策略
Restart=always
# 启动失败后的等待时间(可选)
RestartSec=5

# 日志处理:默认会发送到 journald
StandardOutput=append:/var/log/my-app.out.log
StandardError=inherit

[Install]
# 允许随系统启动
WantedBy=multi-user.target

管理systemd服务

常用的命令如下:

# 新增或修改配置文件以后需要重新加载,类似 supervisorctl reread && supervisorctl update,或者更粗暴的supervisorctl reload
systemctl daemon-reload
# 查看服务状态
systemctl status [yourservice]
# 设置服务开机自启动
systemctl enable [yourservice]
# 加上--now选项可以在设置后立即启动服务,同理用disable命令可以禁用开机自启动
# 手工启动服务
systemctl start [yourservice]

推送到[go4pro.org]