将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]