适用于 CentOS 7+、Ubuntu 16.04+ 等使用 systemd 的发行版。
十一、服务管理
11.1 systemctl 管理系统服务
启动 / 停止 / 重启服务
sudo systemctl start <服务名> # 启动服务
sudo systemctl stop <服务名> # 停止服务
sudo systemctl restart <服务名> # 重启服务
sudo systemctl reload <服务名> # 重新加载配置(不中断服务)
sudo systemctl status <服务名> # 查看服务运行状态
设置开机自启
sudo systemctl enable <服务名> # 启用开机自启
sudo systemctl disable <服务名> # 禁用开机自启
sudo systemctl is-enabled <服务名> # 检查是否已设置为开机自启
查看服务列表
systemctl list-units --type=service # 列出正在运行的服务
systemctl list-units --type=service --all # 列出所有服务(含未启动)
systemctl list-unit-files --type=service # 列出所有服务及启用状态
实际示例
sudo systemctl start nginx # 启动 Nginx
sudo systemctl stop redis # 停止 Redis
sudo systemctl restart mysqld # 重启 MySQL
sudo systemctl enable nginx # 设置 Nginx 开机自启
sudo systemctl status mysqld # 查看 MySQL 运行状态
11.2 service 命令(传统 SysV init)
适用于 CentOS 6 及较早系统。
sudo service <服务名> start # 启动
sudo service <服务名> stop # 停止
sudo service <服务名> restart # 重启
sudo service <服务名> status # 查看状态
sudo chkconfig <服务名> on # 设置开机自启
sudo chkconfig <服务名> off # 禁用开机自启
11.3 注册自定义服务(systemd)
创建 systemd 服务单元文件
对于需要将任意程序注册为系统服务的场景,可使用 systemd 的 .service 单元文件。
服务文件路径:
/etc/systemd/system/— 用户自定义服务(推荐)/usr/lib/systemd/system/— 系统包管理器安装的服务
基本模板
[Unit]
Description=My Custom Service
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/path/to/app
ExecStart=/usr/bin/python3 /path/to/app/main.py
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
常用指令说明
| 指令 | 说明 |
|---|---|
Description= |
服务描述 |
After= |
依赖的服务,在这些服务之后启动 |
Type= |
启动类型:simple(默认)、forking、oneshot 等 |
User= |
运行服务的用户 |
Group= |
运行服务的用户组 |
WorkingDirectory= |
工作目录 |
ExecStart= |
启动命令(必填,需使用绝对路径) |
ExecStop= |
停止命令 |
ExecReload= |
重载命令 |
Restart= |
重启策略:on-failure、always、no |
RestartSec= |
重启间隔(秒) |
Environment= |
环境变量,如 Environment="MY_VAR=value" |
StandardOutput= |
标准输出,如 journal、syslog、inherit |
StandardError= |
错误输出,同上 |
WantedBy= |
安装目标,通常为 multi-user.target |
11.4 将 Python 脚本安装为后台服务(MyService)
以下步骤将 Python 脚本 /opt/myservice/app.py 注册为名为 MyService 的系统服务。
步骤 1:准备 Python 脚本
假设脚本路径为 /opt/myservice/app.py,内容示例:
#!/usr/bin/env python3
import time
import logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
filename='/var/log/myservice.log'
)
def main():
logging.info("MyService started")
while True:
logging.info("Service is running...")
time.sleep(60)
if __name__ == "__main__":
main()
步骤 2:创建 systemd 服务文件
sudo vim /etc/systemd/system/MyService.service
写入以下内容:
[Unit]
Description=MyService - Python Background Service
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/myservice
ExecStart=/usr/bin/python3 /opt/myservice/app.py
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
步骤 3:重新加载并启动服务
sudo systemctl daemon-reload # 重新加载 systemd 配置
sudo systemctl start MyService # 启动服务
sudo systemctl enable MyService # 设置开机自启
sudo systemctl status MyService # 查看服务状态
步骤 4:管理 MyService
sudo systemctl start MyService # 启动
sudo systemctl stop MyService # 停止
sudo systemctl restart MyService # 重启
sudo systemctl reload MyService # 重载配置
sudo systemctl disable MyService # 取消开机自启
# 查看日志
sudo journalctl -u MyService # 查看 MyService 所有日志
sudo journalctl -u MyService -f # 实时跟踪日志
sudo journalctl -u MyService --since "5 min ago" # 查看最近 5 分钟日志
步骤 5:卸载服务
sudo systemctl stop MyService # 停止服务
sudo systemctl disable MyService # 禁用开机自启
sudo rm /etc/systemd/system/MyService.service # 删除服务文件
sudo systemctl daemon-reload # 重新加载配置
11.5 使用 supervisor 管理 Python 脚本(备选方案)
如果不想使用 systemd,也可以使用 supervisor 管理后台 Python 进程。
安装 supervisor
# CentOS / RHEL
sudo yum install -y epel-release
sudo yum install -y supervisor
# Ubuntu / Debian
sudo apt update
sudo apt install -y supervisor
配置 MyService
sudo vim /etc/supervisord.d/MyService.ini
[program:MyService]
command=/usr/bin/python3 /opt/myservice/app.py
directory=/opt/myservice
user=root
autostart=true
autorestart=true
startsecs=5
startretries=3
stdout_logfile=/var/log/myservice_stdout.log
stderr_logfile=/var/log/myservice_stderr.log
environment=PYTHONUNBUFFERED=1
管理 supervisor 服务
sudo supervisorctl reread # 读取新配置
sudo supervisorctl update # 更新配置
sudo supervisorctl start MyService # 启动
sudo supervisorctl stop MyService # 停止
sudo supervisorctl restart MyService # 重启
sudo supervisorctl status # 查看所有进程状态
sudo supervisorctl tail -f MyService # 查看实时日志