一、 配置文件的格式
1. 配置文件的区块名和字段名,都是大小写敏感的。
2. 每个区块内部是一些等号连接的键值对,键值对的等号两侧不能有空格。
[root@cl-server ~]# systemctl cat emqx.service # /usr/lib/systemd/system/emqx.service [Unit] Description=emqx daemon After=network.target [Service] User=emqx Group=emqx Type=forking Environment=HOME=/var/lib/emqx ExecStart=/bin/sh /usr/bin/emqx start LimitNOFILE=1048576 ExecStop=/bin/sh /usr/bin/emqx stop [Install] WantedBy=multi-user.target
二、 配置文件的区块
[Unit]区块: 用来定义 Unit 的元数据,以及配置与其他 Unit 的关系 Description: 简短描述 Documentation: 文档地址 Requires: 当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败 Wants: 与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败 BindsTo: 与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行 Before: 如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动 After: 如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动 Conflicts: 这里指定的 Unit 不能与当前 Unit 同时运行 Condition...: 当前 Unit 运行必须满足的条件,否则不会运行 Assert...: 当前 Unit 运行必须满足的条件,否则会报启动失败
[Install]区块: 通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动。 WantedBy: 它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中 RequiredBy: 它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中 Alias: 当前 Unit 可用于启动的别名 Also: 当前 Unit 激活(enable)时,会被同时激活的其他 Unit
[Service]区块: 用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段如下。 Type: 定义启动时的进程行为。 ExecStart: 启动当前服务的命令 ExecStartPre: 启动当前服务之前执行的命令 ExecStartPost: 启动当前服务之后执行的命令 ExecReload: 重启当前服务时执行的命令 ExecStop: 停止当前服务时执行的命令 ExecStopPost: 停止当其服务之后执行的命令
KillMode: 定义服务如何停止
PIDFile: PID的存放文件, 绝对路径 RestartSec: 自动重启当前服务间隔的秒数 Restart: 定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog TimeoutSec: 定义 Systemd 停止当前服务之前等待的秒数
PrivateTmp: 给服务分配独立的临时空间 Environment: 指定环境变量 EnvironmentFile: 指定加载一个包含服务所需的环境变量的列表的文件,文件中的每一行都是一个环境变量的定义 Nice: 服务的进程优先级,值越小优先级越高,默认为 0。其中 -20 为最高优先级,19 为最低优先级 WorkingDirectory: 指定服务的工作目录 RootDirectory: 指定服务进程的根目录(/ 目录)。如果配置了这个参数,服务将无法访问指定目录以外的任何文件 User: 指定运行服务的用户 Group: 指定运行服务的用户组 MountFlags: 服务的Mount Namespace配置,会影响进程上下文中挂载点的信息,即服务是否会继承主机上已有挂载点,以及如果服务运行执行了挂载或卸载设备的操作,是否会真实地在主机上产生效果。可选值如下 shared: 服务与主机共用一个 Mount Namespace,继承主机挂载点,且服务挂载或卸载设备会真实地反映到主机上 slaved: 服务使用独立的 Mount Namespace,它会继承主机挂载点,但服务对挂载点的操作只有在自己的 Namespace 内生效,不会反映到主机上 private:服务使用独立的 Mount Namespace,它在启动时没有任何任何挂载点,服务对挂载点的操作也不会反映到主机上 LimitCPU / LimitSTACK / LimitNOFILE / LimitNPROC 等: 限制特定服务的系统资源量,例如 CPU、程序堆栈、文件句柄数量、子进程数量等
三、Service区块详解
在 ExecStart、ExecStop 等属性中使用了 Linux 命令, 则必须要写出完整的绝对路径。
对 ExecStartPre 和 ExecStartPost 等辅助命令, 若前面有个 "-" 符号, 表示忽略这些命令的出错。
因为有些"辅助"命令本来就不一定成功, 比如尝试清空一个文件,但文件可能不存在。
3.1 Type类型
- Type=simple: 默认值,执行ExecStart指定的命令,启动主进程; 服务进程不会fork
- Type=forking: 以 fork 方式从父进程创建子进程,创建后父进程会立即退出, 后台运行; 指定PIDFile文件, 以便 Systemd 能够跟踪服务的主进程
- Type=oneshot: 一次性进程,Systemd 会等当前服务退出,再继续往下执行; 需要指定RemainAfterExit=yes, 以便Systemd在服务退出后仍认为服务处于激活状态
- Type=dbus: 当前服务通过D-Bus启动; 当指定的 BusName 出现在 DBus 系统总线上时,Systemd认为服务就绪
- Type=notify: 当前服务启动完毕,会通知Systemd,再继续往下执行
- Type=idle: 若有其他任务执行完毕,当前服务才会运行
3.2 Restart
- no: # 默认, 退出后无操作
- on-success: # 只有正常退出时(退出状态码为0),才会重启
- on-failure: # 非正常退出时,重启,包括信号终止和超时; 对于守护进程,推荐使用on-failure
- on-abnaomal: #只有信号终止或超时,才会重启
- on-abort : # 只有在收到没有捕捉到信号终止时,才会重启
- on-watchdog: # 超市退出时,才会重启
- always: # 不管什么退出原因,都会重启
3.3 Environment/EnvironmentFile
后面接多个不同的shell变量。例如:
- Environment=DATA_DIR=/data/elk
- Environment=LOG_DIR=/var/log/elasticsearch
- Environment=PID_DIR=/var/run/elasticsearch
EnvironmentFile=-/etc/sysconfig/elasticsearch
连词号(-):在所有启动设置之前,添加的变量字段,都可以加上连词号 表示抑制错误,即发生错误时,不影响其他命令的执行。
比如EnviromentFile=-/etc/sysconfig/xxx表示即使文件不存在,也不会抛异常
3.4 KillMode
- contorl-group: 默认, 当前控制组里所有的子进程都会被杀掉
- process: 只杀主进程
- mixed: 主进程将收到SIGTERM(终止进程)信号,子进程将收到SIGKILL(无条件终止)信号
- none: 没有进程会被杀掉,只是执行服务的stop命令
四、Unit文件占位符和模板
4.1 文件占位符
在 Unit 文件中,有时会需要使用到一些与运行环境有关的信息,例如节点ID、运行服务的用户等。这些信息可以使用占位符来表示,然后在实际运行时动态地替换成实际的值。 %n: 完整的 Unit 文件名字,包括 .service 后缀名 %p: Unit 模板文件名中 @ 符号之前的部分,不包括 @ 符号 %i: Unit 模板文件名中 @ 符号之后的部分,不包括 @ 符号和 .service 后缀名 %t: 存放系统运行文件的目录,通常是 “run” %u: 运行服务的用户,如果 Unit 文件中没有指定,则默认为 root %U: 运行服务的用户 I %h: 运行服务的用户 Home 目录,即 %{HOME} 环境变量的值 %s: 运行服务的用户默认 Shell 类型,即 %{SHELL} 环境变量的值 %m: 实际运行节点的 Machine ID,对于运行位置每个的服务比较有用 %b: Boot ID,这是一个随机数,每个节点各不相同,并且每次节点重启时都会改变 %H: 实际运行节点的主机名 %v: 内核版本,即 "uname -r" 命令输出的内容 %%: 在 Unit 模板文件中表示一个普通的百分号
4.2 模板
在现实中,往往有一些应用需要被复制多份运行。例如,用于同一个负载均衡器分流的多个服务实例,或者为每个 SSH 连接建立一个独立的 sshd 服务进程。
Unit 模板文件的写法与普通的服务 Unit 文件基本相同,不过 Unit 模板的文件名是以 @ 符号结尾的。通过模板启动服务实例时,需要在其文件名的 @ 字符后面附加一个参数字符串。
[email protected] 模板 [Unit] Description=My Advanced Service Template After=etcd.service docker.service [Service] TimeoutStartSec=0 ExecStartPre=-/usr/bin/docker kill apache%i ExecStartPre=-/usr/bin/docker rm apache%i ExecStartPre=/usr/bin/docker pull coreos/apache ExecStart=/usr/bin/docker run --name apache%i -p %i:80 coreos/apache /usr/sbin/apache2ctl -D FOREGROUND ExecStartPost=/usr/bin/etcdctl set /domains/example.com/%H:%i running ExecStop=/usr/bin/docker stop apache1 ExecStopPost=/usr/bin/docker rm apache1 ExecStopPost=/usr/bin/etcdctl rm /domains/example.com/%H:%i [Install] WantedBy=multi-user.target
4.3 启动 Unit 模板的服务实例
在服务启动时需要在 @ 后面放置一个用于区分服务实例的附加字符参数,通常这个参数用于监控的端口号或控制台 TTY 编译号。
# systemctl start [email protected]
Systemd 在运行服务时,总是会先尝试找到一个完整匹配的 Unit 文件,如果没有找到,才会尝试选择匹配模板。
例如上面的命令,System 首先会在约定的目录下寻找名为 [email protected] 的文件,如果没有找到,而文件名中包含 @ 字符,它就会尝试去掉后缀参数匹配模板文件。
对于 [email protected], systemd 会找到 [email protected] 模板文件,并通过这个模板文件将服务实例化。
标签:bin,服务,配置文件,Unit,当前,Linux,模板,usr From: https://www.cnblogs.com/kingdomer/p/16919274.html