十一、服务管理

11.1 systemctl 管理系统服务

适用于 CentOS 7+、Ubuntu 16.04+ 等使用 systemd 的发行版。

启动 / 停止 / 重启服务

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(默认)、forkingoneshot
User= 运行服务的用户
Group= 运行服务的用户组
WorkingDirectory= 工作目录
ExecStart= 启动命令(必填,需使用绝对路径)
ExecStop= 停止命令
ExecReload= 重载命令
Restart= 重启策略:on-failurealwaysno
RestartSec= 重启间隔(秒)
Environment= 环境变量,如 Environment="MY_VAR=value"
StandardOutput= 标准输出,如 journalsysloginherit
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     # 查看实时日志