1 Introduction
Systemd 是 Linux 的一个系统和服务管理器。
Systemd service 脚本一般存放于 /etc/systemd 和 /usr/lib/systemd,前者包含 *.target.wants 文件,后者为安装软件生成 service 的目录。
前述两个目录下均包含 system 和 user 目录,前者是系统服务,即开机不需要用户登录即可运行的服务,后者是用户服务,是需要用户登录后才能运行的服务。
Service 脚本以 .service 结尾,包含 Unit、Service 和 Install 三个区块,其中
| 区块 | 描述 |
|---|---|
| Unit 区块 | 描述启动依赖关系 |
| Service 区块 | 定义启动行为 |
| Install 区块 | 定义服务安装 |
- Unit 区块常见的描述字段
- 服务描述
| 字段 | 描述 |
|---|---|
| Description | 当前服务的简短描述 |
| Documentation | 文档位置 |
- 启动顺序
| 字段 | 描述 |
|---|---|
| After | 定义该服务应该在哪些服务(target or service)之后启动 |
| Before | 定义该服务应该在哪些服务(target or service)之前启动 |
- 依赖关系
| 字段 | 描述 |
|---|---|
| Wants | 表示该服务与指定的服务存在“弱依赖”关系,即指定的服务启动失败或退出并不影响该服务的运行 |
| Requires | 表示“强依赖”关系,即指定的服务启动失败或退出则该服务也会退出 |
- Service 区块常见的描述字段
- 启动命令
| 字段 | 描述 |
|---|---|
| EnvironmentFile | 指定当前服务的环境参数文件 |
| Environment | 后可接多个不同的 Shell 变量 |
| User | 设置运行服务的用户 |
| Group | 设置运行服务的用户组 |
| WorkingDirectory | 设置运行服务的路径 |
| Exec(Start|Stop|StartPre|StartPost|StopPost|Reload) | 各种与执行相关的命令 |
- 启动类型
| 字段 | 描述 |
|---|---|
| Type | 可设置的值如下:
|
| RemainAfterExit | yes 表示进程退出后,服务仍然保持执行 |
- 重启行为
| 字段 | 描述 |
|---|---|
| KillMode | 可设置的值如下:
|
| Restart | 定义服务退出后 Systemd 的重启方式。可设置的值如下:
|
| RestartSec | Systemd 重启前需等待的秒数 |
- Install 区块
| 字段 | 描述 |
|---|---|
| WantedBy | 表示该服务所在的 Target |
Target 的含义是服务组,如 WantedBy=multi-user.target 指的是该服务属于 multi-user.target。当执行 systemctl enable xxx.servive 时,xxx.service 的符号链接就会被创建在 /etc/systemd/system/multi-user.target.wants 目录下。可以通过 systemctl get-default 查看系统默认启动的 target。在配置好相应的 WantedBy 字段后,可以实现服务的开机自启动。
假设我们已经编写好服务脚本 /etc/systemd/system/clash_galaxy.service,其内容如下:
[Unit]
Description=The internet proxy clash for galaxy.
After=network.target
[Service]
Type=simple
User=galaxy
Restart=on-abort
ExecStart=/home/galaxy/.config/mihomo/clash
[Install]
WantedBy=graphical.target
首先,利用 sudo systemctl daemon-reload 重新加载所有 Systemd 服务,否则会找不到 clash_galaxy.service 服务。
接着就可以使用下述命令来控制服务:
# 自启动|启动|停止|重启|查看状态
sudo systemctl [enable|start|stop|restart|status] clash_galaxy.service
执行启动命令:sudo systemctl start clash_galaxy.service。
如果希望服务在系统启动时自启动,则需执行命令:sudo systemctl enable clash_galaxy.service。