系统服务启动文件
2025-02-17
服务文件详解
文件位置
- 系统服务目录:
/usr/lib/systemd/system/xxx.service - 用户服务目录:
/etc/systemd/system/xxx.service
配置文件结构
服务文件由三个主要部分组成:
[Unit] 部分
- 定义服务的描述、依赖和顺序
[Service] 部分
- 定义服务的具体行为
[Install] 部分
- 定义服务的启用/禁用配置
Unit部分
常用选项:
| 选项 | 说明 |
|---|---|
| Description | 服务描述信息 |
| After | 在指定服务之后启动 |
| Before | 在指定服务之前启动 |
| Requires | 强依赖关系,依赖服务必须启动 |
| Wants | 弱依赖关系,依赖服务启动失败不影响本服务 |
| Conflicts | 冲突服务,不能同时运行 |
| Documentation | 文档地址 |
| Condition* | 启动条件 |
Service部分
常用选项:
Type 类型
| 类型 | 说明 |
|---|---|
| simple | 默认类型,主进程由 ExecStart 启动 |
| forking | 服务会调用 fork() 创建子进程 |
| oneshot | 一次性执行,执行完就退出 |
| dbus | 通过 D-Bus 启动 |
| notify | 启动完成后发送通知 |
| idle | 等待其他任务完成后才启动 |
进程控制
| 选项 | 说明 |
|---|---|
| User | 运行服务的用户 |
| Group | 运行服务的用户组 |
| WorkingDirectory | 工作目录 |
| RootDirectory | 根目录 |
| Nice | 进程优先级 |
| OOMScoreAdjust | OOM优先级 |
执行相关
[Service]
# 环境配置文件
EnvironmentFile=/etc/sysconfig/myapp
# 启动命令
ExecStart=/usr/bin/myapp
# 启动前执行
ExecStartPre=/usr/bin/pre-start.sh
# 启动后执行
ExecStartPost=/usr/bin/post-start.sh
# 停止命令
ExecStop=/usr/bin/stop.sh
# 服务异常退出时自动重启
Restart=always
# 重启间隔
RestartSec=30特殊标记说明
ExecStart 命令前的特殊标记:
| 标记 | 说明 |
|---|---|
| @ | 参数作为一个整体传递 |
| - | 忽略命令失败 |
| + | 进程获得特权 |
Install部分
常用选项:
| 选项 | 说明 |
|---|---|
| Alias | 服务别名 |
| RequiredBy | 被其他服务强依赖 |
| WantedBy | 被其他服务弱依赖 |
| Also | 同时安装的其他服务 |
| DefaultInstance | 实例默认名称 |
完整示例
[Unit]
Description=My Application Service
After=network.target
Requires=mysql.service
Documentation=https://example.com/docs
[Service]
Type=simple
User=myapp
Group=myapp
WorkingDirectory=/opt/myapp
EnvironmentFile=/etc/sysconfig/myapp
ExecStartPre=/usr/bin/pre-start.sh
ExecStart=/usr/bin/myapp
ExecStop=/usr/bin/stop.sh
Restart=always
RestartSec=30
Nice=-5
[Install]
WantedBy=multi-user.target
Alias=myapp.service注意:
修改服务文件后需要重新加载:
systemctl daemon-reload路径必须使用绝对路径
Type=forking 时建议设置 PIDFile
注意设置合适的用户权限
建议添加文档链接