systemd.service 服务单元配置

名称

systemd.service ———————— 服务单元配置

摘要

service.service

描述

以“.service”结尾的单元配置文件包含由systemd控制和监督的进程的信息。

服务模板

systemd服务可以通过“service@argument.service”语法接受单个参数。此类服务称为“实例化”服务,而没有参数的单元称为“模板”。
例如:dhcpcd@.service服务模板接受网络接口作为参数,从而生成实例化服务。

选项

服务单元文件可能包含[Unit]和[Install]部分,但必须包含[Service]部分,以下是服务单元[Service]部分特有的选项(参数)。

  • fork() 复制出一个新进程,但还没有运行真正的程序
  • execve() 在这个新进程中,加载并运行指定的程序文件

Type=

配置服务通知管理器服务启动已完成的机制。可选值包括:simple、exec、forking、oneshot、dbus、notify、notify-reload或idle。
Type类型如下:

simple

Type类型成功条件优点缺点适用场景关键配置
simple(fork()成功)新进程刚创建出来就认为成功不阻塞,系统启动可能误报成功急速启动的服务或者特殊的守护进程默认配置,一般用于关键服务
exec服务二进制文件真正执行成功systemctl start命令行在报错时,能否反馈真实信息无法知道服务内部是否初始化成功大多数常规服务,像redis、nacos、nginx推荐用于常规服务
forking主进程fork出子进程后自己退出兼容老式Unix守护进程复杂,容易出错。必须配置PIDFile=,否则找不到主进程传统守护进程必须配置PIDFile=
oneshot指定命令执行完并退出适合一次性任务,也可以配合RemainAfterExit=yes让服务保持“活跃”如果不加RemainAfterExit=yes,服务状态会立即变成“dead”初始化脚本常配RemainAfterExit=yes使用
dbus服务在d-bus总线上注册了名字精准控制服务可用性必须使用d-bus通信机制,不适合普通服务提供d-bus接口的服务必须配置BusName=
notify服务启动成功后,发送“READY=1”systemctl start命令可以做到真正等待服务就绪服务必须支持sd_notify调用启动慢或者复杂的长时服务服务需要支持sd_notify调用,NotifyAccess如果缺失或设置为none,会强行设置为main
notify-reload服务重载完成后,发送“READY=1”精确控制重载完成时间服务必须支持sd_notify调用支持热重载的服务,像nginx用于systemctl reload,可配RelaodSignal,在一定程度上与ExecReload等效
idle系统当前没有其它任务要处理时避免shell服务的输出和控制台的状态输出交错仅用于改进控制台输出,不适用于通用的服务排序工具,而且有5秒超时限制简单的shell脚本或输出少量信息的任务仅用于改善控制台使用体验

ExitType=

指定管理器应在何时认为服务已经完成。可选:main或cgroup。
如果设置为main(默认值),服务管理器将在主进程(根据Type=确定),退出时认为该单元已停止。因此,它不能和Type=oneshot一起使用。
如果设置为cgroup,只要cgroup中至少有一个进程未退出,服务就会被视为正在运行。
通常建议在服务具有已知的forking模型并且可以可靠地确定主进程时使用ExitType=main。
ExitType=cgroup适用于forking模型无法提前知道且可能没有特定的主进程的应用程序。ExitType=cgroup非常适合临时或自动生成的服务,例如:桌面环境中的图形应用程序。

RemainAfterExit=

接收”yes“或”no“,指定所有进程都退出后是否仍被视为活动状态。
默认为no。

GuessMainPID=

接收“yes”或“no”,指定systemd在无法可靠确定服务主PID时是否尝试猜测。除非设置了Type=forking且未设置PIDFile=,否则此选项将被忽略,因为对于其他类型或使用显示配置的PID文件,主PID始终已知。
如果守护线程有多个进程组成,猜测算法可能得出错误的结论。
如果无法确定主PID,服务的故障检测和自动重启将无法可靠的工作。
默认值:yes

PIDFile=

指定指向服务PID文件的路径。
建议在Type=forking的服务中使用此选项。指定的路径通常指向/run/目录如下的文件。如果指定指定相对路径,则以/run/为前缀。
服务启动后,服务管理器将从此文件读取服务主进程的PID。服务管理器不会写入此处配置的文件,但如果文件仍然存在,服务管理器会在服务关闭后删除该文件。
注意:PID文件不需要由特权用户拥有,但如果由非特权用户拥有,则会强制执行额外的安全措施:该文件不能是走向其他用户拥有的文件的符号链接(无论是直接拥有还是间接拥有),并且PID文件必须指向已属于该服务的进程。
注意:在现代项目中应避免使用PID文件。尽可能使用Type=notify、Type=notify-reload、Type=simple,这样不需要通过PIDFile选项指定PID文件来确定服务的主进程,并避免不必要的forking。

BusName=

指定该服务应使用的d-bus目标名称。对于Type=dbus的服务,此选项为必填项
建议始终设置此属性(如果已知),以便轻松的将服务名称映射到d-bus目标。特别是,systemctl service-log-level/service-log-target命令会用到此选项。

ExecStart=

此服务启动时执行的命令。
除非Type=oneshot,否则必须指定一个命令。当使用Type=oneshot时,此选项能多次使用,以定义多个要执行的命令。
如果此选项赋值为空字符串,则要启动的命令列表将被重置,先前对此选项的赋值将无效
如果未指定ExecStart=,则服务必须设置RemainAfterExit=yes和至少一行ExecStop=。(缺少ExecStart=和ExecStop的服务无效)
如果配置了多个命令,则这些命令将按照它们在单元文件中出现的顺序依次执行。如果其中一个命令失败(且未以“-”为前缀),则其它命令将不会被执行,并且该单元将被视为失败。
除非设置了Type=forking,否则通过此命令行启动的进程将被视为守护进程的主进程。

ExecStartPre=、ExecStartPost=

分别在ExecStart=命令之前或之后执行的附加命令。语法和ExecStart=相同。允许使用多个命令行,无论服务类型(Type=)如何,这些命令都会按顺序执行。
如果任何这些命令(未以“-”为前缀)失败,则其余命令将不会执行,并且该单元将被视为失败。
只有在所有的未以“-”为前缀的ExecStartPre=命令成功退出后,ExecStart=命令才会开始运行。
ExecStartPost=命令仅在ExecStart=中指定的命令成功调用后运行,具体情况由Type决定。
例如:

  • 对于Type=simple或Type=idle,进程已启动。
  • 对于Type=oneshot,最后一个ExecStart=进程已成功退出。
  • 对于Type=forking,初始进程已成功退出。
  • 对于Type=notify或Type=notify-reload,已发送“READY=1”。
  • 对于Type=dbus,已获取BusName=选项。
    请注意,ExecStartPre=不能启动长时间运行的进程。所有由通过ExecStartPre=调用的进程分叉出来的进程都将在下一个服务进程运行之前被终止。
    请注意,如果ExecStartPre=、ExecStart=或ExecStartPost=中指定的任何命令失败(且未以“-”为前缀)或在服务完全启动之前超时,则将继续执行ExecStopPost=中指定的命令,并跳过ExecStop=中的命令。
    请注意,ExecStartPost=的执行是为了满足Before=/After=排序约束的目的。

ExecCondition=

ExecCondition是在ExecStartPre=中的命令之前执行的命令。语法与ExecStart=相同。允许使用多行命令行,无论服务类型(Type=什么),命令将按照顺序执行。
ExecCondition行为类似于Ex*cStartPre=和条件检查的混合。

  • 当ExecConditaion=命令**以1~254(包含)**退出代码时,剩余的命令 将被跳过,并且该单元不会被标记成失败。
  • 当ExecCondition命令以255或异常退出(例如:超时、被信号终止等),则该单元被视为失败(剩余命令将被逃过)。
  • 当退出代码为0或与SuccessExitStatus=匹配的命令将继续执行后续命令。
    关于在ExecStartPre=中不要运行长时间运行的进程的建议也适用于ExecCondition。在出现任何非零或异常退出的情况下,ExecCondition=还将运行ExecStopPost=中的命令,作为停止服务的一部分。

ExecReload=

用于触发服务配置重新加载的命令,此选项接受多行命令,其格式与ExecStart=所述相同。此选项是可选的。此选项支持使用说明符和环境变量替换,格式与ExecStart=相同。
此选项还设置了一个额外的特殊环境变量:如果已知,则将$MAINPID设置为守护进程的主进程,可用于如下命令行:
ExecReload=kill -HUP $MAINPID
但请注意,通过排队信号(如上命令所示)来重新加载守护进程通常不是一个好选择。因为这是一个异步操作,因为不适用于对多个服务进行相互排序的重新加载。因此,强烈建议使用Type=notify-reload代替ExecReload=,或者将ExecReload=设置为一个不仅触发守护进程配置重新加载,还同步等待其完成的命令。

execStop=

用于停止通过ExecStart=启动的服务的命令。此选项接受多行命令行,其格式与ExecStart=相同。此选项是可选的。
运行此选项中配置的命令后,服务将默认停止,并且其剩余进程将根据KillMode=设置终止。
如果未设置此选项,则在请求停止服务时,将通过发送KillMode=或RestartKillSignal=中指定的信号来终止进程。支持指定符和环境变量替换(包括MAINPID)∗∗请注意∗∗,通常情况下,仅为此选项指定一个命令来请求服务终止,而不等待服务执行终止操作是不够的。由于服务的剩余进程会在命令退出后立即根据上文所述的KillMod=和KillSignal=或RestartKillSignal=被终止,因此这可能无法完全停止服务。因此,指定的命令,应为同步操作,而非异步操作。∗∗请注意∗∗,ExecStop=中指定的命令仅在服务首次成功启动时执行。如果服务从未启动过,或者启动失败,则不会调用这些命令。使用ExecStopPost=可在服务无法正常启动并再次关闭时调用命令。∗∗请注意∗∗,即使服务中的进程自行终止或被终止,只要服务启动成功,停止操作也始终会执行。停止命令必须准备好处理这种情况。如果systemd知道在调用停止命令时主进程已经退出,则MAINPID) **请注意**,通常情况下,仅为此选项指定一个命令来请求服务终止,而不等待服务执行终止操作是不够的。由于服务的剩余进程会在命令退出后立即根据上文所述的KillMod=和KillSignal=或RestartKillSignal=被终止,因此这可能无法完全停止服务。因此,指定的命令,应为同步操作,而非异步操作。 **请注意**,ExecStop=中指定的命令仅在服务首次成功启动时执行。如果服务从未启动过,或者启动失败,则不会调用这些命令。 使用ExecStopPost=可在服务无法正常启动并再次关闭时调用命令。 **请注意**,即使服务中的进程自行终止或被终止,只要服务启动成功,停止操作也始终会执行。停止命令必须准备好处理这种情况。如果systemd知道在调用停止命令时主进程已经退出,则MAINPID请注意,通常情况下,仅为此选项指定一个命令来请求服务终止,而不等待服务执行终止操作是不够的。由于服务的剩余进程会在命令退出后立即根据上文所述的KillMod=KillSignal=RestartKillSignal=被终止,因此这可能无法完全停止服务。因此,指定的命令,应为同步操作,而非异步操作。请注意ExecStop=中指定的命令仅在服务首次成功启动时执行。如果服务从未启动过,或者启动失败,则不会调用这些命令。使用ExecStopPost=可在服务无法正常启动并再次关闭时调用命令。请注意,即使服务中的进程自行终止或被终止,只要服务启动成功,停止操作也始终会执行。停止命令必须准备好处理这种情况。如果systemd知道在调用停止命令时主进程已经退出,则MAINPID将被取消设置。
服务重启请求的实现方式是先执行停止操作,然后再执行启动操作。这意味着ExecStop=和ExecStopPost=会在房屋重启操作期间执行。

ExecStopPost=

服务停止后执行的附加命令。此选项接受多个命令行,其格式与ExecStart=相同。此选项是可选的。支持说明符和环境量替换。
请注意,与ExecStop=不同,使用此选项指定的命令会在服务无法正常启动并再次关闭时调用。
建议使用此选项设置执行即使服务无法正常启动也因执行的清理操作。使用此选项设置的命令需要能够在服务启动中途失败并留下未完全初始化的数据的情况下运行。由于执行使用此选项设置的命令时,服务的进程可以都退出,因此,不应尝试与这些进程通信。

RestartSec=

配置重启服务前的休眠时间(与Restart=的配置一致)。可以采用无单位的秒值,或时间跨度值。

RestartSteps=

配置将自动重启间隔从RestartSec=增加到RestartMaxDelaySec=所需的步骤数。取正整数或0表示禁用。默认为0。
此设置仅在**RestartMaxDelaySec=**也设置的情况下有效。

RestartMaxDelaySec=

配置在RestartStops=选项生效后,重启服务前的最大休眠时间。取值格式与RestartSec相同,或输入“infinity”以禁用该设置。默认值为“infinity”。
此选项仅在**RestartSteps=**参数同时设置时有效。

TimeoutStartSec=

配置启动等待时间。如果守护进程服务未在配置的时间内发出启动完成信号,则该服务将被视为失败并再次关闭。具体操作取决于TimeoutStartFailureMode=选项。该选项可以采用无单位的秒数,或时间跨度值。传递“infinity”可禁用超时逻辑。默认为管理器中设置的DefaultTimeoutStartSec=,但Type=oneshot除外,在这种情况下,超时默认禁用。
请注意,启动超时也适用于服务重新加载,无论是通过ExecReload=实现的,还是通过Type=notify-reload启动的重新加载逻辑实现的。如果重新加载未在配置的时间的内完成,则重新加载将被视为失败,服务将继续使用旧配置运行。这不会影响正在运行的服务,但会被记录下来,并导致例如systemctl reload失败。

TimeoutStopSec=

此选项有两个用途。
首先,它配置等待每个ExecStop=命令的时间。如果任何一个命令超时,后续的ExecStop=命令将被跳过,服务将通过SIGTERM信号终止。如果未指定ExecStop=命令,服务将立即收到SIGTERM信号。此默认行为可通过TimeoutStopFailureMode=选项更改。
其次,它配置等待服务本身停止的时间。如果服务未在指定时间内终止,它将通过SIGKILL信号强制终止。
可以采用无单位秒数或时间跨度值。传递“infinity”可禁用超时逻辑。
默认为管理器配置文件中的DefaultTimeoutStopSec=

TimeoutAbortSec=

此选项配置服务因看门狗超时(WatchdogSec=)而终止时等待终止的时间。
如果服务的TimeoutStopSec=较短,则可以使用此选项为系统提供更多时间来写入服务的核心存储。超时后,服务将被SIGKILL强制终止。在这种情况下,核心转储文件将被截断。使用TimeoutAbortSec=为每个服务设置合理的核心转储超时时间,该超时时间足够长以写入所有预期数据,同时又足够短以及时处理服务故障。
可以采用无单位毫秒数或时间跨度值。
传递空值可跳过专门的看门狗终止超时处理并回退到TimeoutStopSec=。
传递“infinity”可禁用超时逻辑。默认为管理器配置文件中DefaultTimeoutAbortSec=。

TimeoutSec=

将TimeoutStartSec=和TimeoutStopSec=配置为指定值的简写形式。

TimeoutStartMode=、TimeoutStopMode=

这些选项分别配置守护进程服务在其分配的TimeoutStartSec=时间内未发出启动信号时以及在TimeoutStopSec=时间内停止时应采取的措施。可以设置为终止(terminate)、中止(abort)或终止(kill)
两个选项的默认值均为终止(terminatel)
如果设置终止terminate,服务将通过发送KillSignal=中指定的信号正常终止。
如果服务未终止,则会在TimeoutStopSec=之后发送FinalKillSignal=。
如果设置了终止(abort),则会发送WatchdogSignal=,并在发送FinalKillSignal=之前应用TimeoutAbortSec=。
此选项可用于分析间歇性启动或关闭失败的服务。
使用终止(kill)参数,服务将通过发送FinalKillSignal=立刻终止,无需任何超时时间。
此设置可用于快速关闭失败的服务。

RuntimeMaxSec=

此选项配置服务运行的最大时间。如果使用此选项,并且服务的活动时间超过了指定时间,它将被终止并进入故障状态。
请注意,此选项对Type=oneshot类型的服务无效,因为它们在激活完成后会立即终止(使用TimeoutStartSec=来限制它们的激活时间)。传递“infinity(默认值)” 可配置无运行时限制(其实就是禁用超时限制) 。

RuntimeRandomizedExtraSec=

此选项会修改RuntimeMaxSec=,将最大运行时间均匀的增加0到指定值(以秒为单位)之间的时间间隔。如果未指定RuntimeMaxSec=,则此功能将禁用。

WhatchdogSec=

配置服务的看门狗超时时间。看门狗在启动完成后激活。服务必须定期使用“WATCHDOG=1”(即keep-alive ping)调用sd_nofity(3)。如果两次调用之间的时间间隔大于配置的时间,则服务将处于失败状态,并以SIGABRT(WatchdogSignal=指定信号)终止。通过将Restart=设置为on-failure、on-watchdog、on-abnormal或always,服务将自动重启。此处配置的时间将传递给WATCHDOG_USEC=环境变量中执行的服务进程。
如果服务启用看门狗支持,则允许守护进程自动启用keep-alive ping逻辑。
如果使用此选项,则应设置NotifyAccess=以打开对systemd提供的通知套接字的访问权限。如果未设置NotifyAccess=,则会将其隐式设置为main。
默认值0,表示禁用此功能。
可以使用sd_event_setr_watchdog(3)启用自动看门狗通知支持。

Restart=

此选项配置服务进程退出、被退出、被终止、超时时是否重新启动。
服务进程可以是主服务进程,也可以是ExecStartPre=、ExecStartPost=、ExecStop=、ExecStopPost=或ExecReload=指定的进程之一。
如果进程终止是由于systemd操作(服务停止或重启)造成的,则服务将不会重新启动。超时包括错过看门狗“keep-alive ping”的截止时间以及服务启动、重新加载、停止操作超时。
Restart=可设置为no、on-success、onf-failure、on-abnormal、on-watchdog、on-abort或always之一。

  • 如果设置为no(默认值),则服务不会重启。
  • 如果设置为on-success,则仅在服务进程干净退出时重启。干净退出指以下任一情况:
  1. 退出代码为0
  2. 对于Type=oneshot意外的类型,信号为SIGHUP挂断信号、SIGINT中断信号、SIGTERM终止信号、SIGPIPE管道断裂信号之一。
  3. SuccessExitStatus=中指定的退出状态和信号
  • 如果设置为on-failure,则在以下情况下重启服务:
  1. 进程以非零状态退出
  2. 被某个信号终止(包括核心转储,但不包括上述四个信号)
  3. 操作超时(例如服务重新加载)
  4. 触发配置的看门狗超时
  • 如果设置为on-abnormal,则当进程因信号(包括核心转储,不包括上述四个信号)终止、操作超时或触发看门狗超时时,服务将被重新启动
  • 如果设置为on-abort,仅当服务进程因未捕获的信号(未指定为干净退出状态)而退出时,服务才会重新启动
  • 如果设置为on-watchdog,仅当服务的看门狗超到期时,服务才会重新启动
  • 如果设置为always,则无论服务是否干净退出、被信号异常终止或超时,都将重新启动
    请注意,Type=oneshot的服务永远不会在干净退出状态下重新启动,即always和on-success对Type=oneshot不适用。
    | 重启设置/退出原因 | no | always | on-success | on-failure | on-abnormal | on-abort | on-watchdog |
    |------------|----|--------|------------|------------|-------------|----------|-------------|
    | 干净的退出代码或信号 | | X | X | | | | |
    | 不干净的退出代码 | | X | | X | | | |
    | 不干净的信号 | | X | | X | X | X | |
    | 超时 | | X | | X | X | | |
    | 看门狗 | | X | | X | X | | X |

RestartMode=

采用字符串值指定服务重启方式。

  • 如果设置为normal(默认值),服务将通过失败/非活动状态重启。
  • 如果设置为direct,服务将在自动重启期间直接转换为正在激活状态,跳过失败/非活动状态。ExecStopPost=仍会被调用。OnSuccess=和OnFailure=会被跳过。此选项在依赖项可能暂时失败,但我们不希望这些临时故障导致依赖单元失败的情况下非常有用。依赖单元不会收到这些临时故障的通知。
  • 如果设置为debug,服务管理器将在尝试自动重启时以调试级别记录与此单元相关的信息,直到服务达到速率限制或成功,并且将为该单元设置$DEBUG_INVOCATION=1的环境变量。此功能非常有用,因为它能够在服务启动失败时获取更多信息,而无需主动或永久启用systemd中的调试级别日志记录(这会导致日志信息非常冗长)。除此之外,此功能等效于正常模式

SuccessExitStatus=

此选项设置退出状态定义列表,当主服务进程返回这些状态时,除了正常的成功退出状态0以及信号SIGNUP、SIGINT、SIGTERM、SIGPIPE(Type=oneshot除外)外,还被视为成功终止。
退出状态定义可以是数字终止状态、终止状态名称或终止信号名称,并以空格分隔。
请注意,此选项不会更改数字退出状态与其名称之间的映射,及无论如何使用此设置。0仍然映射到“SUCCESS”(因此在工具输出中通常显示为“0/SUCCESS”),1映射到“FAILURE”(因此通常显示为“1/FAILURE”),以此类推。它仅控制这些退出状态的影响,以及如何将其传播到这个服务的状态。
此选项可能出现多次,在这种情况下,成功推出状态列表将被合并。如果将空字符串赋值给此选项,则列表将被重置,之前对此选项的所有赋值都将无效。
注意:systemd-analyze exit-status可用于列出退出状态,并在数字状态值和名称之间进行转换。

RestartPreventExitStatus=

此选项设置退出状态定义列表,当主服务进程返回这些定义时,无论Restart=选项配置了何种重启设置,这些定义都将阻止服务自动重启。
退出状态定义可以是数字形式的终止状态、终止状态名称或终止信号名称,以空格分隔。
默认为空列表,即默认情况下,配置的重启逻辑中,不会排除任何退出状态。
此选项可能出现多次,在这种情况下,将合并用于组织重启的状态列表。
如果将空字符串赋值给此选项,则列表将被重置,并且之前对此选项的所有赋值都将失效。
请注意,此设置对通过ExecStartPre=、ExecStartPost=、ExecStop、ExecStopPost=或ExecReload=配置的进程无效,仅对主服务进程有效,即由ExecStart=调用的进程,或(取决于Type=、PIDFile=等)以其它方式配置的主进程。

RestartForceExitStatus=

此选项接受一个退出状态定义列表,当服务主进程返回这些定义时,无论Restart=中配置的重启设置如何,都将强制服务自动重启。参数格式和RestartPreventExitStatus=类似。
请注意,对于Type=oneshot服务,成功退出状态将阻止它们自动重启,无伦此选项是否列出了相应的退出状态。

RootDirectionOnlyStart=

接受一个布尔值。

  • 如果为true,则根目录仅适用于ExecStart=启动的进程,而不适用于其它ExecStartPre=、ExecStartPost=、ExecReload=、ExecStop= 和 ExecStopPost=命令。
  • 如果为false,则该设置建议相同的方式应用于所有已配置的方式。
    默认值:false

NonBlocking=

此选项为所有通过基于套接字的激活传递的文件设置O_NONBLOCK标志。
如果设置为true,则所有大于等于3的文件描述符(即除了stdin、stdout、stderr之外的所有文件描述符),除了通过文件描述符存储逻辑传入的文件描述符,都将设置O_NONBLOCK标志,从而处于非阻塞模式。
此选项仅与套接字单元配合使用才有效,并且对先前已保存在文件描述符存储中的文件文件描述符无效。
默认值:false
请注意,如果将同一个套接字单元配置传递给多个服务单元,并且这些服务具有不同的NonBlocking=配置,则O_NONBLOCK的具体状态取决于这些服务的调用顺序,并且可能在服务代码已经占有套接字文件描述符后发生变化,这是因为套接字的O_BLOCK状态由引用它的所有文件描述符共享。因此,所有共享一套接字的服务都必须使用相同的NonBlocking=配置,并且不要在服务代码中更改该标志。

NotifyAccess=

此选项控制对服务状态通知套接字的访问,可通过sd_notify(3)调用访问。可取none(默认值)、main、exec、all之一。

  • 如果为none,则不接受来自服务进程的守护进程状态更新,所有状态更新信息都将被忽略。
  • 如果为main,则仅接受来自服务主进程的状态更新。
  • 如果为exec,则仅接受来自任何Exec*=命令的主进程或控制进程发送的服务更新。
  • 如果为all,则接受来自服务控制组所有成员的所有服务更新。
    使用Type=notify、Type=notify-reload、Type=WatchdogSec=时,应设置此选项以打开对通知套接字的访问。如果使用了这些选项但未设置NotifyAccess=,则将隐式设置为main。
    请注意,只有当发送进程在PID 1处理消息时仍然存在,或者发送进程在运行时被服务管理器明确跟踪时,sd_notify()通知才可能被正确的归因于单元。如果服务管理器最初从该进程fork出来,则属于后者。相反,如果单元的辅助进程发送了sd_notify()信息后立即退出,服务管理器可能无法正确的将该消息归因于单元,因此会忽略该消息,即使已为其设置了NotifyAccess=all。
    因此,为了消除所有涉及查找客户端单元并将通知正确归因于单元的竞争条件,可以使用sd_notify_barrier()。此调用充当同步点,并确保在此调用之前发送的所有通知在服务管理器成功返回时均已被服务管理器接收。对于未被服务管理器调用的客户端,需要使用sd_notify_barrier(),否则此同步机制对于将通知归因于单元而言是不必要的。

Sockets=

此选项制定此服务启动时应继承的套接字文件描述符的套接字单元名称。
通常情况下,无法使用此设置,因为所有与服务同名(当然,单元名称后缀不同)的套接字文件描述符都会传递给生成的进程。
请注意,相同的套接字文件描述符可以同时传递给多个进程。另请注意,传入套接字流量可能激活与最终配置为继承套接字文件描述符的服务不同的服务。换句话说:.socket单元的Service=设置不必与其引用的.service的Sockets=设置的相反。
此选项可能出现多次,在这种情况下,套接字单元列表将被合并。请注意,设置后,不支持再次清楚套接字列表(例如,将此选项赋值为空字符串)。

FileDescriptionStoreMax=

使用sd_pid_notify_with_fds(3)的“FDSTORE=1”消息,配置服务管理器中可以存储多少个文件描述符。这对于实现在显示请求或崩溃后重启且不丢失状态的服务非常有用。任何打开的套接字和其它在重启期间不应关闭的文件描述符都可以通过这种方式存储。应用程序状态可以序列化为RuntimeDirectory=中的文件,也可以存储在memfd_create(2)内存描述符中。
默认值为0,即服务管理器中不能存储任何文件描述符。所有从特定服务传递给服务管理器的文件描述符都会在下次服务重启时传回服务的主进程。
任何传递给服务管理器的文件描述符,当检测到POLLHUP或PULLERR错误时,或者服务完全停止且没有队列或正在执行的作业时,都会自动关闭。
如果使用此选项,则应将NotifyAccess=设置为打开systemd提供的套接字的访问权限。如果未设置NotifyAccess=,则它将被隐式设置为main。
systemd-analyze(1)的fdstore命令可用于列出服务描述符存储取得当前内容。
请注意,服务管理器只会将文件描述符存储区中包含的文件描述符传递给服务自身进程,而不会通过IPC或类似方式传递给其它客户端。但是,它允许非特权客户端查询服务当前打开的文件描述符列表。因此,敏感数据可以安全地放置在引用的文件中,但不因附加到存储文件描述符的元数据中。
如果此选项设置为非零值,则会为该服务调用的进程设置$FDSOTRE环境变量。

FileDescriptionStorePreserve=

此选项用于控制何时释放服务的文件描述符存储(即,何时关闭包含的文件描述符,如果有),可选值:no、yes、restart。

  • 如果设置为no,则文件描述符存储会在服务停止时自动释放。
  • 如果设置为restart(默认值),则只要单元既非处于非活动状态也非失败,或者有作业正在为该服务排队,或者该服务预计会重新启动,文件描述符存储就会一直保留。
  • 如果设置为yes,则文件描述符存储会一直保留,直到单元从内存中移除(即不再被引用且处于非活动状态)。后者有助于将文件描述符存储中间的条目固定到服务管理器退出为止。
    使用systemctl clean --what=fdstore 明确释放文件描述符存储。

USBFunctionDescriptors=

配置包括USB FunctionFS描述符的文件的位置,用于实现USB小工具功能。
此选项仅与已配置ListenUSBFunction=的套接字单元配合使用。此文件内容在打开ep0文件后会写入其中。

USBFunctonStrings=

配置包含USB FunctionFS字符串的文件的位置,和USBFunctionDescriptors=类似。

OOMPolicy=

为内核和用户空间OOM终止程序systemd-oomd.service(8)配置内存不足(OOM)终止策略。
在linux上,当内存变得稀缺,以至于内核无法为自己分配内存时,它可能会决定终止正在运行的进程,以释放内存并减轻内存压力。
请注意,systemd-oom.service是一种更灵活的解决方案,它旨在通过在内核采取行动之前尝试提前终止服务,不仅防止内核出现内存不足的情况,也防止用户空间出现内存不足的情况。
此设置可采用continue、stop或kill之一。

  • 如果设置为continue,并且单元中的某个进程被OOM终止程序终止,则会记录此事件,但单元将继续运行。
  • 如果设置为stop,则会记录此事件,但单元将由服务管理器彻底终止。
  • 如果设置为kill,并且单元中的一个进程被OOM终止程序终止,则会指示内核通过将memory.oom.group属性设置为1来终止该单元的所有进程。
    默认设置为systemd-system.conf(5)中DefaultOOMPolicy=的设置,但对于已启用Delegate=的单元,默认设置为continue。
    使用OOMSourceAdjust=设置来配置单元中的进程是否应该被linux OOM终止程序逻辑视为优先或次优先的进程终止候选。
    此设置也适用于systemd-oomd.service(8).与内核执行的内核OOM终止类似,此设置决定了systemd-oomd终止与其关联的cgroup后单元的状态。

OpenFile=

接受“path[:fd-name:options]”格式的参数,其中:

  • path是文件系统中文件或AF_UNIX套接字的路径
  • fd-name是将与文件描述符关联的名称;该名称可以包含任何ASCLL字符,但必须排除控制字符和“:”,并且长度最长为255个字符;它是可选的,如果不提供,默认为文件名。
  • options是以逗号分隔的访问选项列表;可能的值为“read-only”、“append”、“truncate”、“graceful”;如果未指定,文件将以读写模式打开;如果指定了“graceful”,则文件/套接字打开过程中的错误将被忽略。多次指定相同的选项将被视为错误。
    服务管理器会打开文件或套接字,并将文件描述符传递给服务。如果路径是套接字,我们会对其调用connect()。
    此设置可用于允许服务访问其自身无法访问的文件/套接字。
    此设置可以多次指定,在这种情况下,所有的指定的路径都会打开,并将文件描述符传递给服务。
    如果指定了空字符串,则在此之前定义的完整打开文件列表将会被重置。

ReloadSignal=

配置在请求重新加载服务配置时发送给服务主进程的UNIX进程信号。
默认是SIGHUP。除非是用Type=notify-reload,否则此选项无效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迷途的家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值