.service 文件是 systemd 管理服务的配置文件,它告诉 systemd 如何启动、停止、管理和监控一个服务(守护进程、后台程序或长期运行的任务)。

简单来说,它的作用就是 把程序变成可以被 systemd 控制的服务。

.service 文件一般位于 /etc/systemd/system/ 或 /lib/systemd/system/,结构分为三个主要区块:

[Unit]
[Service]
[Install]

[Unit] 区块

用于描述服务及其依赖关系。
常用字段:

字段 含义 示例
Description 对服务的描述 Description=FastAPI Gunicorn Service
After 启动顺序,指定依赖的服务先启动 After=network.target(网络服务启动后再启动)
Requires 强依赖,指定服务必须存在,否则不启动 Requires=postgresql.service
Wants 弱依赖,依赖失败不影响本服务启动 Wants=redis.service
Conflicts 指定冲突的服务,不能同时运行 Conflicts=apache2.service

Tip: After 只影响顺序,不保证依赖存在;如果必须依赖,请用 RequiresWants

[Service] 区块

核心区块,定义服务运行方式、用户、启动命令、重启策略等。

字段 含义 示例
Type 服务类型(systemd 如何判断服务启动完成) simple, forking, notify, idle
ExecStart 启动服务的命令 /var/www/fastapi/venv/bin/gunicorn app.main:app -k uvicorn.workers.UvicornWorker --bind 127.0.0.1:8000
ExecStop 停止服务的命令 ExecStop=/bin/kill -TERM $MAINPID
User 运行服务的系统用户 User=python
Group 运行服务的系统组 Group=python
WorkingDirectory 服务工作目录 WorkingDirectory=/var/www/fastapi
Environment 设置环境变量 Environment="PATH=/var/www/fastapi/venv/bin"
Restart 重启策略 no, on-failure, always, on-abort
RestartSec 重启间隔(秒) RestartSec=3
StandardOutput / StandardError 输出日志方式 StandardOutput=journal, StandardError=journal
TimeoutStartSec 启动超时(秒) TimeoutStartSec=30
TimeoutStopSec 停止超时 TimeoutStopSec=30
KillMode 如何发送信号终止服务 KillMode=control-group

常用 Type 说明

Type 说明 使用场景
simple 默认类型,ExecStart 启动的进程就是主进程 Python/Gunicorn/FastAPI
forking 进程 fork 子进程并退出父进程 传统守护进程
notify 服务启动完成后会通知 systemd systemd-aware 守护进程
idle 延迟启动直到其他服务空闲 较少用

Restart 策略

含义
no 不自动重启(默认)
on-success 只有正常退出(状态码 0)才重启
on-failure 非 0 或异常退出重启
on-abort 仅信号中止才重启
always 无条件重启

结合 RestartSec 使用,可以防止频繁崩溃循环重启。

[Install] 区块

用于控制开机自启和 target 依赖。

字段 含义 示例
WantedBy 指定 target,multi-user.target 是普通系统服务 WantedBy=multi-user.target
RequiredBy 指定服务必须依赖此服务 RequiredBy=some.service

配合 systemctl enable 使用,开机自动启动。

输出与日志

推荐输出到 journal:

StandardOutput=journal
StandardError=journal

或输出到文件:

StandardOutput=file:/var/log/fastapi/access.log
StandardError=file:/var/log/fastapi/error.log

ystemd 会管理服务状态并可通过 journalctl -u 服务名 查看日志。

完整示例(守护 Python/FastAPI)

[Unit]
Description=FastAPI Gunicorn Service
After=network.target

[Service]
Type=simple
User=python
Group=python
WorkingDirectory=/var/www/fastapi
Environment=”PATH=/var/www/fastapi/venv/bin”
ExecStart=/var/www/fastapi/venv/bin/gunicorn app.main:app \
-k uvicorn.workers.UvicornWorker \
–bind 127.0.0.1:8000 \
–workers 4 \
–access-logfile /var/www/fastapi/logs/access.log \
–error-logfile /var/www/fastapi/logs/error.log
Restart=on-failure
RestartSec=3
TimeoutStartSec=30
TimeoutStopSec=30
KillMode=control-group
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

说明:

  • [Unit] → 描述服务,定义依赖
  • [Service] → 核心,启动命令、用户、重启策略、日志等
  • [Install] → 定义开机自启 target
  • Type=simple + Restart=on-failure + RestartSec 是守护进程常用组合
  • 日志和权限最好配置在 [Service] 内

 

作者 admin

百度广告效果展示