文章目录

  • 示例脚本
  • [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 列表

参考