文章目录
- 示例脚本
- [Unit] 模块 -- 服务说明
- [Service] 模块 -- 核心区域
- [Install] 模块
示例脚本
[Unit] # 主要是服务说明
Description=test # 简单描述服务
After=network.target # 描述服务类别,表示本服务需要在network服务启动后在启动
Before=xxx.service # 表示需要在某些服务启动之前启动,After和Before字段只涉及启动顺序,不涉及依赖关系。
[Service] # 核心区域
Type=forking # 表示后台运行模式。
User=user # 设置服务运行的用户
Group=user # 设置服务运行的用户组
KillMode=control-group # 定义systemd如何停止服务
PIDFile=/usr/local/test/test.pid # 存放PID的绝对路径
Restart=no # 定义服务进程退出后,systemd的重启方式,默认是不重启
ExecStart=/usr/local/test/bin/startup.sh # 服务启动命令,命令需要绝对路径
PrivateTmp=true # 表示给服务分配独立的临时空间
[Install]
WantedBy=multi-user.target # 多用户
[Unit] 模块 – 服务说明
Option | Description |
Description | Unit 的简短描述 |
Documentation | 参考文档 URI 列表 |
Before, After | Units 的启动顺序 |
Requires | 此 Unit 启动需要的依赖,如果依赖 “停用” 或 “发生故障”,此 Unit 将被停用 |
Wants | 配置较 “Requires” 弱的依赖性 – 如果列出的 Unit 未成功启动,则此 Unit 启动没有影响 |
Conflicts | 如果一个 Unit 已经在其他 Unit 上设置,则 “启动前者” 将 “停止后者” – 反之亦然(互斥) |
[Service] 模块 – 核心区域
Option | Description |
Type | 配置影响 “ExecStart” 功能和相关选项 Unit 进程的启动类型: + simple – 默认值,从 ExecStart 开始的进程是服务的主要进程 + forking – 从 “ExecStart” 开始的进程产生一个子进程,该子进程为该服务的主要进程(启动完成后,父进程退出) + oneshot – 类似于 “simple” ,但进程在启动后续 Units 之前会退出 + dbus – 类似于 “simple” ,但只有在主进程获得 D-Bus 名称后,才启动后续 Unit + notify – 类似于 “simple” ,但只有通过 “sd_notify() 函数” 发送通知消息后才会启动后续 Unit + idle – 类似于 “simple” ,服务二进制文件的实际执行将被延迟,直到所有作业完成,避免了 “状态输出” 和 “服务的 Shell 输出” 混合 |
ExecStart | 指定启动设备时要执行的 “命令” 或 “脚本” + “ExecStartPre” 和 “ExecStartPost” 指定要在 “ExecStart” 之前、之后执行的自定义命令 + “Tpye=oneshot” 可以指定多个自定义命令,然后顺序执行 |
ExecStop | 指定 Unit 停止时要执行的 “命令” 或 “脚本” |
ExecReload | 指定重新加载 Unit 时,要执行的 “命令” 或 “脚本” |
Restart | 启动此选择后,服务将在 “进程退出” 后 “重新启动”,但 systemctl 命令将执行 “干净停止(clean stop)” |
RemainAfterExit | 如果设置为 “True”,即使退出所有进程,该服务也会被视为活动状态 默认:False – 如果设置了 “Type=oneshot” 则此项特别有用 |
# 运行用户、用户组:
- User=user -- 设置服务运行的用户
- Group=user -- 设置服务运行的用户组
# Type 类型:
- simple(默认)-- 以 ExecStart 字段启动的进程为主进程
- forking -- ExecStart 字段以 fork() 方式启动,此时父进程讲退出,子进程称为主进程(后台运行)。【一般都设置为 forking】
- oneshot -- 类似于 simple ,单只执行一次,systemd 会等他执行完成,再执行其他服务
- dubs -- 类似于 simple ,但会等 D-Bus 信号后启动
- notify -- 类似于 simple ,启动结束后会发出通知信号,然后 systemd 再启动其他服务
- idle -- 类似于 simple ,等到其他任务都执行完,才会启动该服务
# EnvironmentFile:
- 指定配置文件,和 "连词号(-)" 组合使用 -- 可以避免配置文件不存在的异常
# Environment:后面接多个不同 Shell 变量
- Environment=ES_DATA=/usr/local/elasticsearch/data
- Environment=ES_LOG=/usr/local/elasticsearch/log
- Environment=ES_PID=/usr/local/elasticsearch/data/elasticsearch.pid
- EnvironmentFile=-/usr/local/elasticsearch/xxxx.file
# 连词号 -- "(-)":
- 在所有启动设置之前,添加的变量字段,都可以加上 "连词号"
- 表示 "抑制错误",在发生错误时,不影响其他命令的执行
- "EnvironmentFile=-/usr/local/elasticsearch/xxxx.file" -- 当文件不存在时,也不会抛异常
# KillMode 的类型:
- control-group(默认) -- 当前控制组里的所有子进程,都会被杀掉
- process -- 只杀主进程
- mixed -- 主进程将收到 "SIGTERM 信号",子进程收到 "SIGKILL" 信号
- none -- 没有进程会被杀掉,只是执行服务的 stop 命令
# Restart 的类型:
- no(默认值) -- 退出后无操作
- on-success -- 只有正常退出时(退出状态码 0),才会重启
- on-failure -- 非正常退出,重启,包括被信号终止、超时等
- on-abnormal -- 只有 "被信号终止" 或 "超时",才会重启
- on-abort -- 只有 "收到没有捕获到的信号终止时",才会重启
- on-watchdog -- 超时退出,才会重启
- always -- 不管 "什么原因退出",都会重启
# 对于 "守护进程" ,推荐使用 on-failure
# RestartSec 字段:
- 表示 systemd 重启服务之前,需要等待的时间:RestartSec: 30 (单位: s)
# 各种 Exec* 字段:
- Exec* 后面接的命令,仅接受 "指令 参数 参数.." 格式,不接收 "<> | &" 等特殊字符,很多 bash 语法也不支持,如果想支持 bash 语法,需要设置 Type=oneshot
- ExecStart -- 启动服务时,执行的命令
- ExecReload -- 重启服务时,执行的命令
- ExecStop -- 停止服务时,执行的命令
- ExecStartPre -- 启动服务前,执行的命令
- ExecStopPost -- 停止服务后,执行的命令
# WantedBy 字段:
- multi-user.target -- 多用户命令行状态,这个设置很重要
- graphical.target -- 图形用户状态,依赖于 multi-user.target
# 文件限制:
- file size -- LimitFSIZE=infinity
- cpu time -- LimitCPU=infinity
- virtual memory size -- LimitAS=infinity
- locked-in-memory size -- LimitMEMLOCK=infinity
- open files -- LimitNoFILE=64000
- processes/threads -- LimitNPROC=64000
[Install] 模块
Option | Description |
Alias | 空格分隔 Unit 附加名称列表,大多数命令(不包括 “systemctl”、“systemctl enable”)可以使用别名而不是实际的 Unit 名称 |
RequiredBy,WantedBy | 当列出的服务被启动,此服务也会被启动 参考:“Wants Requires”、"[Unit]" |
Also | 指定用户运行 “systemctl enable”、“systemctl disable” 时,要与 Unit 一起 “启用” 或 “禁用” 的 Unit 列表 |
参考
- 编写 systemctl 启动脚本
- Systemd: Service File Examples
- systemd.unit
- systemd.service — Service unit configuration