.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 只影响顺序,不保证依赖存在;如果必须依赖,请用 Requires 或 Wants。
[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] 内