深入了解 Systemd 之 Service 单元
Unit 部分⌗
Unit 部分用于定义单元的启动顺序与依赖关系。
Description⌗
单元名称简介,该选项尽量简短且易于理解。
示例⌗
Description=Nginx Web Server
Documentation⌗
单元的文档URL地址列表,多个URL用空格隔开。支持 https://
、file:
、info:
、man:
类型的URL;
示例⌗
Documentation=http://nginx.org/en/docs file:/usr/local/nginx/docs
Requires⌗
定义单元的强依赖,指定当前单元依赖的其他单元列表,以空格分割多个单元。如果这个单元被激活,这里列出的单元也将被激活。如果设置了 After
并且其中有一个单元无法激活(涉及依赖关系,与启动顺序无关,默认他们是并行启动的)。
Wants⌗
定义单元的弱依赖,与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败(涉及依赖关系,与启动顺序无关,默认他们是并行启动的)。
BindsTo⌗
与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行。
Before⌗
如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动(只涉及启动顺序,不涉及依赖关系)。
After⌗
如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动(只涉及启动顺序,不涉及依赖关系)。
Conflicts⌗
这里指定的 Unit 不能与当前 Unit 同时运行。
Condition…⌗
当前 Unit 运行必须满足的条件,否则不会运行。
Assert…⌗
当前 Unit 运行必须满足的条件,否则会报启动失败。
- Requisite:
- Wants:指定依赖的服务;并不强依赖,如果没有指定 After 则该单元与依赖单元不会并行启动;
- BindsTo:
- After:指定依赖的服务,在指定服务启动后,启动本服务;
- PartOf:
- Conflicts:
- OnFailure:
- PropagatesReloadTo:
- ReloadPropagatedFrom:
- JoinsNamespaceOf:
- RequiresMountsFor:
- OnFailureJobMode:
- IgnoreOnIsolate:
- StopWhenUnneeded:
- RefuseManualStart:
- RefuseManualStop:
- AllowIsolate:
- DefaultDependencies:
- CollectMode:
- FailureAction:
- SuccessAction:
- FailureActionExitStatus:
- SuccessActionExitStatus:
- JobTimeoutSec:
- JobRunningTimeoutSec:
- JobTimeoutAction:
- JobTimeoutRebootArgument:
- StartLimitIntervalSec:
- StartLimitBurst:
- StartLimitAction:
- RebootArgument:
依赖关系通常被用在服务(service)而不是目标(target)上。例如,network.target
一般会被某个配置网络接口的服务引入,所以,将自定义的单元排在该服务之后即可,因为 network.target
已经启动。
Service 部分⌗
该部分定义 Unit 的启动行为。
该部分的选项可以使用
-
连词号,来表示抑制错误,即发生错误的时候,不影响其他命令的执行。
Type⌗
定义 Unit 启动类型。
可选项⌗
- simple(默认值):Systemd 认为该服务将立即启动。服务进程不会 fork 。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是 socket 激活型。
- forking:Systemd 认为当该服务进程 fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便 Systemd 能够跟踪服务的主进程。
- oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。
- notify:与 simple 相同,但约定服务会在就绪后向 Systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。
- dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,Systemd 认为服务就绪。
- idle:Systemd 会等待所有任务处理完成后,才开始执行 idle 类型的单元。其他行为与 Type=simple 类似。
User⌗
Group⌗
DynamicUser⌗
SupplementaryGroups⌗
PAMName⌗
WorkingDirectory⌗
定义运行服务时的工作目录,如果该字段未设置,则判断是否设置 User
字段,如果两个都为设置,则该字段值默认为 /
。如果设置了 User
的值,则该字段为 User
指定用户的 ~
目录,即 Home 目录。
示例⌗
WorkingDirectory=~
作用范围⌗
- service.service;
- socket.socket;
- mount.mount;
- swap.swap。
LimitCPU⌗
LimitFSIZE⌗
LimitDATA⌗
LimitSTACK⌗
LimitCORE⌗
LimitRSS⌗
LimitNOFILE⌗
LimitAS⌗
LimitNPROC⌗
LimitMEMLOCK⌗
LimitLOCKS⌗
LimitSIGPENDING⌗
LimitMSGQUEUE⌗
LimitNICE⌗
LimitRTPRIO⌗
LimitRTTIME⌗
LimitCPU⌗
LimitCPU⌗
LimitCPU⌗
LimitCPU⌗
LimitCPU⌗
LimitCPU⌗
LimitCPU⌗
LimitCPU⌗
BindPaths⌗
RemainAfterExit⌗
GuessMainPID⌗
PIDFile⌗
BusName⌗
ExecStart⌗
启动当前服务的命令,可以结合 EnvironmentFile
配置项,使用 $OPTIONS
获取配置文件的 KEY/VALUE。
/usr/sbin/sshd -D $OPTIONS
ExecStartPre⌗
启动当前服务之前执行的命令
ExecStartPost⌗
启动当前服务之后执行的命令
ExecReload⌗
重启当前服务时执行的命令
ExecStop⌗
停止当前服务时执行的命令
ExecStopPost⌗
停止当其服务之后执行的命令
RestartSec⌗
自动重启当前服务间隔的秒数
TimeoutStartSec⌗
TimeoutStopSec⌗
TimeoutSec⌗
定义 Systemd 停止当前服务之前等待的秒数
RuntimeMaxSec⌗
WatchdogSec⌗
Restart⌗
定义何种情况 Systemd 会自动重启当前服务。
可选项⌗
- no(默认值):退出后不会重启
- on-success:只有正常退出时(退出状态码为0),才会重启
- on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启
- on-abnormal:只有被信号终止和超时,才会重启
- on-abort:只有在收到没有捕捉到的信号终止时,才会重启
- on-watchdog:超时退出,才会重启
- always:不管是什么退出原因,总是重启
Environment⌗
指定环境变量
EnvironmentFile⌗
许多软件都有自己的环境参数文件,该文件可以用 EnvironmentFile 字段读取。该文件内部的 key=value 键值对,可以用 $key 的形式,在当前配置文件中获取。
KillMode⌗
定义 Systemd 如何停止 Unit。
可选项⌗
- control-group(默认值):当前控制组里面的所有子进程,都会被杀掉
- process:表示只停止主进程,不停止子进程,这个配置很少用到,但在 SSH 中会用到,如果你需要停止 sshd 服务,但是不希望,当前的 ssh session 断开。
- mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
- none:没有进程会被杀掉,只是执行服务的 stop 命令。
SuccessExitStatus⌗
RestartPreventExitStatus⌗
RestartForceExitStatus⌗
RootDirectoryStartOnly⌗
NonBlocking⌗
NotifyAccess⌗
Sockets⌗
FileDescriptorStoreMax⌗
USBFunctionDescriptors⌗
USBFunctionStrings⌗
PermissionsStartOnly⌗
是否以 root
用户权限执行 *Pre 和 *Post 脚本,如 ExecStartPre
、ExecStartPost
。
注意:该字段已被弃用,但是未删除。
示例⌗
PermissionsStartOnly=true
Install 部分⌗
通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动。
WantedBy⌗
它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中。
示例⌗
WantedBy=multi-user.target
RequiredBy⌗
它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中。
示例⌗
WantedBy=multi-user.target
Alias⌗
当前 Unit 可用于启动的别名。
示例⌗
Alias=nginx
Also⌗
当前 Unit 激活(enable)时,会被同时激活的其他 Unit。
示例⌗
Also=php-fpm.service
Socket 激活⌗
我们知道,HTTP服务器启动在那里,终究是耗费资源的。那么能不能做到,只有有人访问时,才启动服务,否则就关闭? 这在 Systemd 里面叫做"Socket 激活"。开发者可以指定 Socket 监听的端口,系统根据有没有收到请求,自动启动或关闭服务。不难想到,只要前面加一层负载均衡器,这就等同于实现了一个简单的云服务,即根据访问量,系统自动扩容或收缩。
I hope this is helpful, Happy hacking…