systemd

ps: 文件中不支持注释
[Unit]
# 描述服务的简短文字
Description=Your Custom Service

# 在哪个目标之后启动服务
After=network.target

# 在哪个目标之前启动服务
Before=another.target

# 定义服务依赖关系
Requires=dependency.service
Wants=optional-dependency.service

# 标记服务成功或失败
SuccessExitStatus=1  # 默认是 0

# 禁用/启用服务
# Default: enabled
# 如果设置为"disabled",系统引导时将不启动该服务
# 如果设置为"enabled",系统引导时将启动该服务
# 如果设置为"static",该服务无法手动启动,仅在其它服务依赖时启动
# 如果设置为"masked",该服务将被屏蔽,不能手动启动,即使有依赖关系
# 如果设置为"invalid",该服务单元文件无效
ConditionPathExists=/path/to/file  # 检查文件是否存在
ConditionSecurity=selinux  # 在 SELinux 启用时运行

# 计时器配置
OnBootSec=5min
OnUnitInactiveSec=1h
OnCalendar=*-*-* 01:00:00
RandomizedDelaySec=1min

[Service]
# 启动服务时执行的命令或脚本
ExecStart=/path/to/your/command

# 重启策略:always(始终重启)、on-failure(仅在失败时重启)、...
Restart=always

# 重启延迟
RestartSec=3

# 超时时间
TimeoutStartSec=1min
TimeoutStopSec=30s

# 指定服务运行时的用户和组
User=your_username
Group=your_group

# 设置环境变量
Environment=VAR1=value1 VAR2=value2

# 工作目录
WorkingDirectory=/path/to/your/working/directory

# 限制资源使用(例如内存、CPU等)
LimitMEMLOCK=infinity
LimitNOFILE=4096

# 将服务标记为“独立”(不等待主进程退出)
Type=simple

# 标准输出/错误重定向
StandardOutput=journal
StandardError=journal

# 是否创建一个私有的 /tmp 和 /var/tmp
PrivateTmp=true

# 是否将 /home 和 /run/user 变为只读
ProtectHome=yes

# 是否将 /etc,/usr,/boot 变为只读
ProtectSystem=full

# 让服务对文件系统进行读写
ReadWritePaths=/path/to/readwrite/files

# 设置进程的CPU亲和性
CPUAffinity=1 2

# 设置进程的优先级
Nice=10

# 其他设置(略)

[Install]
# 在哪个目标中启用服务
WantedBy=multi-user.target

首页 ·指令
systemd 开发
名字
systemd.service — 服务单元配置

概要
service.service

描述
名称以 “” 对有关进程的信息进行编码 由 systemd 控制和监督。.service

本手册页列出了特定于 此单元类型。参见 systemd.unit(5) 了解所有单元配置文件的通用选项。共同点 配置项在泛型中配置 [单元][安装] 部分。特定于服务的配置选项包括 在 [Service] 部分中配置。

其他选项列在 systemd.exec(5) 中, 定义执行命令的执行环境 在 systemd.kill(5) 中, 定义服务进程的终止方式, 在 systemd.resource-control(5) 中, 为进程配置资源控制设置 服务。

如果启用了 SysV init compat,systemd 会自动创建包装 SysV init 的服务单元 scripts(服务名称与脚本名称相同,但带有“” 后缀添加);参见 systemd-sysv-generator(8)。.service

systemd-run(1) 命令允许动态创建和单元 并暂时从命令行。.service.scope

服务模板
systemd 服务可以通过 "" 语法。此类服务称为“实例化”服务,而不带参数的单元定义称为“模板”。例如,服务模板将网络接口作为 参数来形成实例化服务。在服务文件中,此参数或“实例 name“可以使用 %-说明符进行访问。有关详细信息,请参见 systemd.unit(5)。service@argument.servicedhcpcd@.service

自动依赖关系
隐式依赖关系
隐式添加了以下依赖项:

自动设置的服务 获取 类型和 上的依赖关系。Type=dbusRequires=After=dbus.socket

套接字激活的服务在以下时间自动排序 它们的激活单元通过 自动依赖。 服务也吸引了所有单位 在 via automatic 和 dependencies 中列出。.socketAfter=.socketSockets=Wants=After=

由于以下原因,可能会添加其他隐式依赖项 执行和资源控制参数,如 systemd.exec(5) 和 systemd.resource-control(5) 中所述。

默认依赖项
除非设置,否则将添加以下依赖项:DefaultDependencies=no

服务单元将具有 类型和 on 的依赖关系,类型 on 的依赖关系以及 类型和 on 的依赖关系。这些确保了正常的维修设备拉入 基本系统初始化,并在系统关闭之前完全终止。仅涉及早期服务的 启动或延迟系统关闭应禁用此选项。Requires=After=sysinit.targetAfter=basic.targetConflicts=Before=shutdown.target

实例化服务单元(即名称中带有“”的服务单元)由 默认为每个模板的切片单元(参见 systemd.slice(5)),以 模板单元,包含特定模板的所有实例。此切片通常在关机时停止, 以及所有模板实例。如果不需要,请在 模板单元,并定义自己的每个模板切片单元文件,该文件也设置 ,或设置(或其他合适的切片) 在模板单元中。参见 systemd.resource-control(5)。@DefaultDependencies=noDefaultDependencies=noSlice=system.slice

选项
服务单元文件可能包括 [Unit][Install] 部分, 这些部分在 systemd.unit(5) 中进行了描述。

服务单元文件必须包含 [Service] 部分,其中包含有关服务和 它监督的过程。可用于 此部分与其他单位类型共享。这些选项是 在 systemd.exec(5)、systemd.kill(5) 和 systemd.resource-control(5) 中记录。 特定于 [Service] 部分的选项 服务单位如下:

Type=
配置服务通知管理器服务启动的机制 已完成。、 、 、 、 、 或 之一:simpleexecforkingoneshotdbusnotifynotify-reloadidle

如果设置为(默认值 if 已指定,但 both nor are),则 服务经理将认为设备在主服务进程具有 被分叉(即紧接在 之后和之前 各种进程 属性已经配置好了,特别是在新进程调用实际服务二进制文件之前。通常,是更好的选择,见下文。simpleExecStart=Type=BusName=fork()execve()Type=exec

预计配置的进程是主要的 服务的过程。在此模式下,如果进程向 系统及其通信通道应在服务启动之前安装 (例如,由 systemd 设置的套接字,通过套接字激活),因为服务管理器将立即 在创建主服务流程之后,在创建主服务流程之后,继续启动后续单元 执行服务的二进制文件。请注意,这意味着 systemctl start 命令 即使服务的二进制文件,服务的行也会报告成功 无法成功调用(例如,因为所选的 存在,或者缺少服务二进制文件)。ExecStart=simpleUser=

类型类似于 ,但 服务管理器将认为设备在主服务二进制文件后立即启动 执行。服务经理将延迟后续单元的启动,直到该时间点。(或在 换句话说:在返回后立即进行进一步的工作,而在服务过程成功之前不会继续进行。 请注意,这意味着当无法成功调用服务的二进制文件时,服务的 systemctl start 命令行将报告失败(对于 例如,因为所选文件不存在,或者服务二进制文件是 缺失)。execsimplesimplefork()execfork()execve()execUser=

如果设置为 ,管理器将认为设备已启动 在管理器分叉的二进制文件退出后立即退出。此类型的使用 不鼓励使用,请改用 notify、notify-reload 或 dbus。forking

预计配置的进程将作为其启动的一部分进行调用。当出现以下情况时,父进程应退出 启动完成,所有通信通道都已建立。孩子继续以 主服务进程,服务经理将考虑单元启动时父级 进程退出。这是传统 UNIX 服务的行为。如果使用此设置,则为 建议同时使用该选项,以便 systemd 能够可靠地 确定服务的主要进程。经理将继续启动后续单位 父进程退出后。ExecStart=fork()PIDFile=

的行为类似于 ; 但是,在主进程退出后,服务管理器将考虑设备启动。然后它会 启动后续单元。 对于这种类型特别有用 的服务。 如果 none 或 not 指定,则为隐含默认值。请注意,如果这个 选项在没有服务的情况下使用,将永远不会进入 “” 单元状态,但会直接从 “” 到 “” 或 “”, 因为没有配置应连续运行的进程。具体而言,这意味着在 这种类型的服务已运行(并且尚未设置),它不会 之后出现,但已经死了。oneshotsimpleRemainAfterExit=Type=oneshotType=ExecStart=RemainAfterExit=activeactivatingdeactivatingdeadRemainAfterExit=

的行为类似于 ;然而 此类型的单元必须具有指定的 Service Manager 和 Service Manager 当获得指定的总线名称时,将考虑该单元。此类型是默认类型 如果。dbussimpleBusName=BusName=

配置了此选项的服务单元会隐式获得对单元的依赖关系。此类型的服务单元被视为位于 激活状态,直到获取指定的总线名称。它被认为是激活的,而 巴士名称被采用。一旦总线名称被释放,该服务将被视为不再 功能,其效果是服务管理器尝试终止任何剩余的 属于服务的进程。在关闭过程中删除其总线名称的服务 因此,逻辑应该准备好接收(或任何信号 在 中配置。dbus.socketSIGTERMKillSignal=

的行为类似于 ;然而 预计服务会通过 sd_notify(3) 或 完成启动时的等效调用。systemd 将继续开始跟进 发送此通知消息后的单位。如果使用此选项,则应(见下文)设置为打开对通知的访问 systemd 提供的套接字。如果缺少或设置为 ,则将强制设置为 。notifyexecREADY=1NotifyAccess=NotifyAccess=nonemain

如果服务支持重新加载,并使用信号开始重新加载,则建议改用。notify-reload

的行为类似于 , 但有一个区别:UNIX 进程信号被发送到服务的 当服务被要求重新加载时,主进程,管理器将等待通知 关于正在完成的重新加载。notify-reloadnotifySIGHUP

启动重新加载过程时,服务应回复通知 通过 sd_notify(3) 发送的消息,其中包含 “” 字段与 “” 设置为当前单调时间 (即 在clock_gettime(2)) 以 μs 为单位,格式为十进制字符串。重新加载完成后,必须发送另一条通知消息 发送,包含“”。使用此服务类型并实现此 重新加载协议是提供用于重新加载服务配置的命令的有效替代方法。RELOADING=1MONOTONIC_USEC=CLOCK_MONOTONICREADY=1ExecReload=

发送的信号可以通过 进行调整,见下文。ReloadSignal=

的行为与 ;然而 服务程序的实际执行将延迟,直到分派所有活动作业。这可以被使用 以避免 shell 服务的输出与控制台上的状态输出交错。请注意,这个 type 仅对提高控制台输出有用,它作为通用单位排序工具没有用,并且 此服务类型的效果受 5 秒超时的约束,之后将调用服务程序 无论如何。idlesimple

建议用于长时间运行 服务,因为它可以确保进程设置错误(例如,缺少服务等错误 可执行文件或缺少用户)被正确跟踪。但是,由于此服务类型不会传播 服务自身启动代码中的失败(与准备步骤中的失败相反 Service Manager 在 ) 之前执行,并且不允许对其他 完成服务代码本身初始化的单位(例如,这很有用 如果客户端需要通过某种形式的 IPC 连接到服务,并且 IPC 通道仅 由服务本身建立 — 与通过套接字或总线提前执行此操作相反 激活或类似),在许多情况下可能还不够。如果是这样,则 、 或 (后者仅在服务的情况下 提供 D-Bus 接口)是首选选项,因为它们允许服务程序代码 精确安排何时考虑服务已成功启动以及何时继续 随访单位。/ 服务类型需要 服务代码库中的显式支持(作为或等效的 API 需要在适当的时间由服务调用) — 如果它不受支持,那么是一种替代方法:它支持传统的重量级 UNIX 服务 启动协议。请注意,使用除 可能延迟 启动过程,因为服务管理器需要等待至少一些服务初始化 完成。(另请注意,通常不建议使用或用于长时间运行的服务。Type=execexecve()notifynotify-reloaddbusnotifynotify-reloadsd_notify()forkingsimpleidleoneshot

请注意,各种服务设置(例如,通过 libc NSS)可能会导致“隐藏”阻止对其他服务的 IPC 调用,当 使用。有时,建议使用服务类型来确保 服务管理器的事务逻辑不受此类潜在缓慢操作的影响 和隐藏的依赖项,因为这是服务管理器不会等待的唯一服务类型 对于此类服务执行设置操作,请在继续操作之前完成。User=Group=simple

ExitType=
指定经理应将服务视为已完成的时间。其中一项或:maincgroup

如果设置为(默认值),则服务管理器 将考虑该单元在主进程退出时停止,这是根据 确定的。因此,它不能与 一起使用。mainType=Type=oneshot

如果设置为 ,只要 cgroup 中至少有一个进程尚未退出。cgroup

通常建议在服务具有 可以可靠地确定已知的分叉模型和主进程。 适用于其分叉模型事先未知的应用程序,并且 可能没有特定的主进程。它非常适合瞬态或自动生成的服务, 例如桌面环境中的图形应用程序。ExitType=mainExitType=cgroup

在版本 250 中添加。

RemainAfterExit=
采用一个布尔值,该值指定是否 即使所有 进程已退出。缺省值为 .no

GuessMainPID=
采用一个布尔值,该值指定是否 systemd 应该尝试猜测服务的主 PID,如果它 无法可靠地确定。除非设置此选项,否则将忽略此选项,并且未设置此选项,因为对于其他类型 或者使用显式配置的 PID 文件,主 PID 为 永远知道。猜测算法可能会不正确 如果守护进程由多个进程组成,则得出结论。如果 无法确定主PID,故障检测和 自动重新启动服务将无法可靠地工作。 缺省值为 .Type=forkingPIDFile=yes

PIDFile=
采用引用服务的 PID 文件的路径。建议将此选项用于以下情况 services 其中设置为 。指定的路径通常指向 复制到下面的文件。如果指定了相对路径,则以 为前缀。服务管理器将从中读取服务主进程的 PID 文件。服务管理器不会写入此处配置的文件,尽管它 如果文件仍然存在,将在服务关闭后将其删除。PID 文件不需要拥有 由特权用户拥有,但如果它由非特权用户拥有,则强制执行其他安全限制: 该文件可能不是指向其他用户(直接或间接)拥有的文件的符号链接,并且 PID 文件必须引用已属于该服务的进程。Type=forking/run//run/

请注意,在现代项目中应避免使用 PID 文件。使用 ,或在可能的情况下,不使用 需要使用 PID 文件来确定服务的主要进程,并避免不必要的 分 叉。Type=notifyType=notify-reloadType=simple

BusName=
采用此服务应使用的 D-Bus 目标名称。此选项是必需的 对于服务,其中设置为 。建议 如果已知,请始终设置此属性,以便于将服务名称映射到 D-Bus 目标。 具体而言,systemctl service-log-level/service-log-target 谓词使用 这。Type=dbus

ExecStart=
启动此服务时执行的命令。该值被拆分为零 或根据下面“命令行”部分中描述的规则设置更多命令行。

除非 is ,否则必须给出一个命令。使用时,可以指定零个或多个命令。命令可以由以下方式指定 在同一指令中提供多个命令行,或者,可以指定此指令 比一次具有相同的效果。如果将空字符串分配给此选项,则要启动的命令列表 重置时,此选项的先前分配将不起作用。如果否是 指定,则服务必须具有且至少有一个行集。(缺少两者的服务,并且无效。Type=oneshotType=oneshotExecStart=RemainAfterExit=yesExecStop=ExecStart=ExecStop=

如果指定了多个命令,则命令为 按它们在单元中出现的顺序依次调用 文件。如果其中一个命令失败(并且前缀不以 “”),其他行不执行,并且 设备被视为故障。-

除非设置了 通过此命令行启动的进程将被视为 守护进程的主进程。Type=forking

ExecStartPre=, ExecStartPost=
之前执行的其他命令 或在命令之后, 分别。语法与 for 相同,只是多个命令 允许行,并在 其他,连续。ExecStart=ExecStart=

如果这些命令中的任何一个(不以 “”) 失败,其余的不执行,并且 设备被视为故障。-

ExecStart=命令仅在 所有未带前缀的命令 以“”退出成功。ExecStartPre=-

ExecStartPost=只有在成功调用 中指定的命令后,才会运行命令,由下式确定(即进程已启动 或 ,最后一个进程已成功退出 ,初始进程已成功退出 ,“” 为 / 发送,或 已被采用)。ExecStart=Type=Type=simpleType=idleExecStart=Type=oneshotType=forkingREADY=1Type=notifyType=notify-reloadBusName=Type=dbus

请注意,可能不是 用于启动长时间运行的进程。所有进程分叉 关闭 通过 WILL 调用的进程 在运行下一个服务进程之前被终止。ExecStartPre=ExecStartPre=

请注意,如果 、 或 中指定的任何命令失败(并且不以 “”,见上文)或在服务完全启动之前超时,使用命令继续执行 中指定,将跳过 中的命令。ExecStartPre=ExecStart=ExecStartPost=-ExecStopPost=ExecStop=

请注意,出于/排序约束的目的,考虑了执行。ExecStartPost=Before=After=

ExecCondition=
在 中的命令之前执行的可选命令。 语法与 for 相同,只是允许使用多个命令行,并且 命令一个接一个地串行执行。ExecStartPre=ExecStart=

该行为类似于 和 条件检查混合:当命令退出时,退出代码为 1254(含),其余命令 命令被跳过,设备不会被标记为失败。但是,如果命令以 255 退出或异常(例如超时,则被 信号等),设备将被视为失败(其余命令将被跳过)。退出代码 0 或 这些匹配项将继续执行到下一个命令。ExecStartPre=ExecCondition=ExecCondition=SuccessExitStatus=

关于不运行长时间运行的进程的相同建议也适用于 。 还将运行以下命令 在 ,作为停止服务的一部分,在任何非零或异常的情况下 出口,如上所述。ExecStartPre=ExecCondition=ExecCondition=ExecStopPost=

在版本 243 中添加。

ExecReload=
在服务中触发配置重新加载而要执行的命令。这个论点 采用多个命令行,遵循与上述相同的方案。此设置的使用是可选的。说明符和环境 此处支持变量替换,其方案与 相同。ExecStart=ExecStart=

设置了一个额外的特殊环境变量:如果已知,则为 设置为守护程序的主进程,并可用于命令行,如下所示:$MAINPID

ExecReload=kill -HUP $MAINPID
但请注意,通过对信号进行排队来重新加载守护程序(如上面的示例行所示)是 通常不是一个好的选择,因为这是一个异步操作,因此不适合在以下情况下使用 对多个服务相互重新加载进行排序。因此,强烈建议您这样做 用于代替 ,或设置为不仅 触发守护程序的配置重新加载,但也会同步等待它完成。为 例如, dbus-broker(1) 使用如下命令:Type=notify-reloadExecReload=ExecReload=

ExecReload=busctl call org.freedesktop.DBus \
        /org/freedesktop/DBus org.freedesktop.DBus \
        ReloadConfig
ExecStop=
为停止通过 启动的服务而执行的命令。此参数采用多个命令行,遵循相同的方案 如上所述。此设置的使用是可选的。之后 运行此选项中配置的命令,暗示服务已停止,并且任何 根据设置终止剩余的进程(参见 systemd.kill(5))。 如果未指定此选项,则通过发送 service stop 中指定的信号或当 service stop is 要求。支持说明符和环境变量替换(包括,见上文)。ExecStart=ExecStart=KillMode=KillSignal=RestartKillSignal=$MAINPID

请注意,通常仅为此设置指定一个仅询问 服务终止(例如,通过向其发送某种形式的终止信号),但不 等待它这样做。由于在命令退出后立即根据和/或如上所述终止服务的其余进程,因此 可能不会导致干净的停止。因此,指定的命令应该是同步操作,而不是 异步的。KillMode=KillSignal=RestartKillSignal=

请注意,中指定的命令仅在服务 首先成功启动。如果服务从未启动过,或者如果 启动失败,例如,因为 中指定的任何命令失败(并且没有以 “”,见上文)或超时。用于在 服务无法正确启动,并再次关闭。另请注意,停止操作始终是 如果服务成功启动,则执行,即使服务中的进程在其 拥有或被杀。必须准备好停止命令来处理这种情况。 如果 systemd 知道主进程在调用 stop 命令时已退出,则将取消设置。ExecStop=ExecStart=ExecStartPre=ExecStartPost=-ExecStopPost=$MAINPID

服务重新启动请求作为停止操作实现,然后是启动操作。这 表示 和 在 服务重新启动操作。ExecStop=ExecStopPost=

建议将此设置用于与请求的服务通信的命令 干净的端接。对于事后清理步骤,请改用。ExecStopPost=

ExecStopPost=
服务停止后执行的其他命令。这包括以下情况 在服务未定义任何命令或服务意外退出的情况下,使用了 中配置的命令。此参数需要多个 命令行,遵循与 中描述的相同方案。使用这些设置 是可选的。支持说明符和环境变量替换。请注意,与使用此设置指定的命令不同,是在服务启动失败时调用的 正确启动并再次关闭。ExecStop=ExecStop=ExecStart=ExecStop=

建议将此设置用于清理操作,即使在 服务无法正确启动。使用此设置配置的命令需要能够运行,即使 服务中途启动失败,并留下了未完全初始化的数据。作为服务的 进程已终止,当执行使用此设置指定的命令时,它们应该 不要尝试与他们交流。

请注意,使用此设置配置的所有命令都使用 服务,以及主进程的退出代码和状态,在 和环境变量中设置,参见 systemd.exec(5) 详。$SERVICE_RESULT$EXIT_CODE$EXIT_STATUS

请注意,出于/排序约束的目的,考虑了执行。ExecStopPost=Before=After=

RestartSec=
配置重新启动前的睡眠时间 服务(配置了 )。 采用以秒为单位的无单位值,或时间跨度值(例如) 如“520 秒”。默认值为 100 毫秒。Restart=

RestartSteps=
配置增加间隔所要采取的步骤数 的自动重新启动自 。 采用正整数或 0 以禁用它。默认值为 0。RestartSec=RestartMaxDelaySec=

仅当还设置了此设置时,此设置才有效。RestartMaxDelaySec=

在版本 254 中添加。

RestartMaxDelaySec=
配置重新启动服务之前的最长休眠时间 随着间隔的增加。取值 格式与 或 “” 相同 以禁用该设置。默认值为 “”。RestartSteps=RestartSec=infinityinfinity

仅当还设置了此设置时,此设置才有效。RestartSteps=

在版本 254 中添加。

TimeoutStartSec=
配置等待启动的时间。如果守护程序服务没有发出信号 在配置的时间内启动完成,则服务将被视为失败,并将 再次关闭。具体操作取决于选项。采用以秒为单位的无单位值,或时间跨度值,例如“520 秒”。通过 “” 禁用超时逻辑。默认在管理器中设置,除非使用 when,在这种情况下,超时默认是禁用的(参见 systemd-system.conf(5))。TimeoutStartFailureMode=infinityDefaultTimeoutStartSec=Type=oneshot

如果 / 发送的服务 “”,这可能会导致开始时间延长到 。在超过此消息之前必须首次收到此消息,一旦开始时间延长,服务管理器将允许服务继续启动, 前提是服务在指定的时间间隔内重复“” 直到服务启动状态由“”完成。(见sd_notify(3))。Type=notifyType=notify-reloadEXTEND_TIMEOUT_USEC=…TimeoutStartSec=TimeoutStartSec=TimeoutStartSec=EXTEND_TIMEOUT_USEC=…READY=1

在版本 188 中添加。

TimeoutStopSec=
此选项有两个用途。首先,它配置等待每个命令的时间。如果其中任何一个超时,后续命令 被跳过,服务将被终止。如果未指定任何命令,则服务将立即获取。此默认行为 可以通过选项进行更改。其次,它配置了时间 等待服务本身停止。如果未在规定时间内终止,则将被强制终止 by (参见 systemd.kill(5))。 采用以秒为单位的无单位值,或时间跨度值(例如) 如“520 秒”。传递 “” 以禁用 超时逻辑。默认为从管理器 配置文件(参见 systemd-system.conf(5))。ExecStop=ExecStop=SIGTERMExecStop=SIGTERMTimeoutStopFailureMode=SIGKILLKillMode=infinityDefaultTimeoutStopSec=

如果 / 发送的服务 “”,这可能会导致停止时间延长到 。在超过此消息之前必须首次收到此消息,一旦停止时间延长,服务管理器将允许服务继续停止, 前提是服务在指定的时间间隔内重复“”, 或自行终止(见sd_notify(3))。Type=notifyType=notify-reloadEXTEND_TIMEOUT_USEC=…TimeoutStopSec=TimeoutStopSec=TimeoutStopSec=EXTEND_TIMEOUT_USEC=…

在版本 188 中添加。

TimeoutAbortSec=
此选项配置由于 看门狗超时(请参见)。如果服务较短,此选项可用于为系统提供更多时间来写入服务的核心转储。服务到期后 将被强制终止(参见 systemd.kill(5))。核心文件将 在这种情况下被截断。用于为每 服务足够大,可以写入所有预期数据,同时也足够短,可以处理服务故障 在适当的时候。WatchdogSec=TimeoutStopSec=SIGKILLKillMode=TimeoutAbortSec=

采用以秒为单位的无单位值,或时间跨度值,例如“520 秒”。传递一个空值以跳过 专用看门狗中止超时处理和回退。通过 “” 禁用超时逻辑。默认为 from Manager 配置文件(参见 systemd-system.conf(5))。TimeoutStopSec=infinityDefaultTimeoutAbortSec=

如果 / 的服务处理自身(而不是依赖内核来写入核心转储),它可以 发送 “” 将中止时间延长到 。在超过此消息之前必须首次收到此消息,一旦中止时间延长,服务管理器将允许服务继续中止, 前提是服务在指定的时间间隔内重复“”, 或自行终止(见sd_notify(3))。Type=notifyType=notify-reloadSIGABRTEXTEND_TIMEOUT_USEC=…TimeoutAbortSec=TimeoutAbortSec=TimeoutAbortSec=EXTEND_TIMEOUT_USEC=…

在版本 243 中添加。

TimeoutSec=
用于将 和 配置为指定值的简写。TimeoutStartSec=TimeoutStopSec=

TimeoutStartFailureMode=、TimeoutStopFailureMode=
这些选项配置在守护程序服务未发出信号时所执行的操作 启动在其配置内,如果它没有停止在 。取 和 之一。这两个选项都默认为 .TimeoutStartSec=TimeoutStopSec=terminateabortkillterminate

如果设置,则服务将通过发送信号正常终止 中指定(默认为 ,参见 systemd.kill(5))。如果 服务不会终止,之后发送。如果设置,则发送 而是在发送 . 此设置可用于分析间歇性启动或关闭失败的服务。 通过使用该服务,该服务将立即通过发送终止,没有任何进一步的超时。此设置可用于加快 关闭故障服务。terminateKillSignal=SIGTERMFinalKillSignal=TimeoutStopSec=abortWatchdogSignal=TimeoutAbortSec=FinalKillSignal=killFinalKillSignal=

在版本 246 中添加。

RuntimeMaxSec=
配置服务运行的最长时间。如果使用此功能并且服务已 活动时间超过指定时间,它将被终止并进入故障状态。请注意,此设置 对服务没有任何影响,因为它们在 激活完成。传递 “”(默认值)以配置无运行时 限制。Type=oneshotinfinity

如果 / 发送的服务 “”,这可能会导致运行时超出 。在超过此消息之前必须首次收到此消息,并且一旦运行时延长到 ,服务管理器将允许服务继续运行, 前提是服务在指定的时间间隔内重复“” 直到通过“”(或终止)实现服务关闭。(见sd_notify(3))。Type=notifyType=notify-reloadEXTEND_TIMEOUT_USEC=…RuntimeMaxSec=RuntimeMaxSec=RuntimeMaxSec=EXTEND_TIMEOUT_USEC=…STOPPING=1

在版本 229 中添加。

RuntimeRandomizedExtraSec=
此选项通过将最大运行时间增加 在 0 和指定值(以秒为单位)之间均匀分布的持续时间。如果是 未指定,则此功能将被禁用。RuntimeMaxSec=RuntimeMaxSec=

在版本 250 中添加。

WatchdogSec=
配置服务的监视程序超时。 启动完成后,看门狗被激活。这 服务必须定期调用sd_notify(3),并使用“”(即 “保持活动 ping”)。如果两次此类调用之间的时间是 大于配置的时间,则服务将放在 失败状态,它将以 (或 指定的信号 ) 终止。通过设置为 、 或 ,服务将自动 重新 启动。此处配置的时间将传递给 在环境变量中执行了服务进程。这 允许守护进程自动启用保持活动状态的 ping 逻辑(如果为服务启用了看门狗支持)。如果这 选项,(见下文) 应设置为开放对通知套接字的访问 由 systemd 提供。如果是 not set,它将隐式设置为 。 默认值为 0,表示禁用此功能。该服务可以 检查服务管理器是否需要监视程序保持活动状态 通知。详见sd_watchdog_enabled(3)。sd_event_set_watchdog(3) 可用于启用自动看门狗通知支持。WATCHDOG=1SIGABRTWatchdogSignal=Restart=on-failureon-watchdogon-abnormalalwaysWATCHDOG_USEC=NotifyAccess=NotifyAccess=main

Restart=
配置服务是否应 当服务进程退出、终止或 已达到超时。服务流程可能是主要的 服务过程,但它也可能是过程之一 用 、 、 、 或 指定。当过程死亡时 是 systemd 操作的结果(例如,service stop 或 restart),服务将不会重新启动。超时包括 错过了看门狗“Keep-alive ping”截止日期和服务 启动、重新加载和停止操作超时。ExecStartPre=ExecStartPost=ExecStop=ExecStopPost=ExecReload=

采用 、 、 、 、 或 之一。 如果设置为(默认值),则服务将 不会重新启动。如果设置为 ,则 仅当服务进程完全退出时才会重新启动。 在此上下文中,干净退出意味着以下任何一项:noon-successon-failureon-abnormalon-watchdogon-abortalwaysnoon-success

退出代码为 0;
对于 、 、 或 之一的信号以外的类型 , , , 或Type=oneshotSIGHUPSIGINTSIGTERMSIGPIPE;
中指定的退出状态和信号。SuccessExitStatus=
如果设置为 ,服务将重新启动 当进程以非零退出代码退出时,是 由信号终止(包括在核心转储上,但不包括 上述四个信号),当一个操作(如 服务重新加载)超时,以及配置的看门狗 触发超时。如果设置为 , 进程终止时,服务将重新启动 通过信号(包括在核心转储上,不包括 上述四个信号),当操作超时时,或 当触发看门狗超时时。如果设置为 ,则仅重新启动服务 如果服务进程由于未捕获的信号而退出,则不 指定为干净退出状态。如果设置为 ,服务将重新启动 仅当服务的看门狗超时过期时。如果设置了 至 ,服务将重新启动 不管它是否干净地退出,都被终止了 信号异常,或超时。on-failureon-abnormalon-aborton-watchdogalways

表 1.退出原因和 Restart= 设置的影响

重新启动设置/退出原因	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

作为上述设置的例外,该服务不会 如果退出代码或信号在(见下文)或 使用 systemctl stop 或等效操作停止服务。此外,服务将始终是 如果中指定了退出代码或信号,则重新启动(见下文)。RestartPreventExitStatus=RestartForceExitStatus=

请注意,服务重启取决于单位启动率 使用 和 进行限制配置,详见 systemd.unit(5)。StartLimitIntervalSec=StartLimitBurst=

将其设置为 长时间运行的服务的推荐选择,以便 通过尝试自动恢复来提高可靠性 错误。对于能够终止的服务 自己的选择(并避免立即重新启动)是另一种选择。on-failureon-abnormal

RestartMode=
采用一个字符串值,该值指定服务应如何重新启动:

如果设置为(默认值),则服务重新启动时间 正在经历失败/非活动状态。normal

如果设置为 ,则服务将转换为激活 状态,跳过失败/非活动状态。 被调用。 并被跳过。directExecStopPost=OnSuccess=OnFailure=

此选项在依赖项可能暂时失败的情况下很有用 但是我们不希望这些暂时的故障使从属单元失败。 当此选项设置为 时,不会通知从属单元这些临时故障。direct

在版本 254 中添加。

SuccessExitStatus=
获取主服务返回时的退出状态定义列表 过程中,将被视为成功终止,除了正常的成功退出状态外 0 和,除了 、 信号 、 、 和 。退出状态定义可以是 数字终止状态、终止状态名称或终止信号名称,分隔如下: 空间。参见 systemd.exec(5) 中的进程退出代码部分 终止状态名称列表(对于此设置,仅对没有 应使用 “” 或 “” 前缀)。参见 signal(7) 信号名称列表。Type=oneshotSIGHUPSIGINTSIGTERMSIGPIPEEXIT_EX_

请注意,此设置不会更改数字退出状态与其 名称,即无论如何使用此设置,0 仍将映射到 “” (因此在工具输出中通常显示为 “”) 和 1 到 “”(因此通常显示为“”),依此类推。它 仅控制这些退出状态的影响,以及它如何传播到 整个服务。SUCCESS0/SUCCESSFAILURE1/FAILURE

此选项可能会出现多次,在这种情况下,成功退出状态的列表为 合并。如果将空字符串分配给此选项,则列表将被重置,所有先前的分配 此选项将不起作用。

例 1.具有 SuccessExitStatus= 设置的服务

SuccessExitStatus=TEMPFAIL 250 SIGKILL
退出状态 75 ()、250 和终止信号被视为干净的服务终止。TEMPFAILSIGKILL


注意:systemd-analyze exit-status 可用于列出退出状态和 在数字状态值和名称之间进行转换。

在版本 189 中添加。

RestartPreventExitStatus=
获取主服务返回时的退出状态定义列表 进程,将阻止自动重新启动服务,而不考虑使用 .退出状态定义可以是数字退出代码或终止 信号名称,并用空格分隔。默认为空列表,因此默认情况下没有退出 状态已从配置的重启逻辑中排除。例如:Restart=

RestartPreventExitStatus=1 6 SIGABRT
确保退出代码 16 以及终止信号不会 导致服务自动重启。此选项可能会出现多次,在这种情况下,列表 的 阻止重新启动状态 被合并。如果将空字符串分配给此选项,则列表为 重置,此选项的所有先前分配将不起作用。SIGABRT

请注意,此设置对通过 、 、 或 配置的进程没有影响,而仅对主服务有影响 进程,即由其他配置的 main 调用的进程或(取决于 , , ...) 过程。ExecStartPre=ExecStartPost=ExecStop=ExecStopPost=ExecReload=ExecStart=Type=PIDFile=

在版本 189 中添加。

RestartForceExitStatus=
获取退出状态定义的列表,这些定义: 当由主服务进程返回时,将强制自动 服务重新启动,而不考虑配置的重新启动设置 跟。参数格式为 似。Restart=RestartPreventExitStatus=

在版本 215 中添加。

RootDirectoryStartOnly=
采用布尔参数。如果为 true,则根 目录, 正如使用选项配置的那样 (参见 systemd.exec(5) 了解更多信息), 只应用于启动的进程 用 ,而不是到各种 其他 和命令。如果为 false,则 设置以相同的方式应用于所有配置的命令。 默认值为 false。RootDirectory=ExecStart=ExecStartPre=ExecStartPost=ExecReload=ExecStop=ExecStopPost=

NonBlocking=
为通过传递的所有文件描述符设置标志 基于套接字的激活。如果为 true,则所有文件描述符 >= 3(即除 stdinstdoutstderr 之外的所有描述符), 排除那些通过文件描述符存储逻辑传入的那些(有关详细信息,请参阅),将设置标志,因此处于非阻塞模式。此选项仅 与套接字单元结合使用很有用,如 systemd.socket(5) 中所述,并且对以前保存在 file-descriptor 存储中的文件描述符没有影响 例。默认值为 false。O_NONBLOCKFileDescriptorStoreMax=O_NONBLOCK

请注意,如果将同一套接字单元配置为传递给多个服务单元(通过设置,见下文),并且这些服务具有不同的配置,则 的确切状态取决于调用这些服务的顺序,并且可能会在服务代码之后更改 已经拥有了套接字文件描述符,这仅仅是因为套接字的状态由引用的所有文件描述符共享 它。因此,共享同一套接字的所有服务都必须使用相同的配置,并且不要更改服务代码中的标志 也。Sockets=NonBlocking=O_NONBLOCKO_NONBLOCKNonBlocking=

NotifyAccess=
控制对服务状态通知套接字的访问,可通过 sd_notify(3) 调用访问。采用(默认值)、或 .如果 ,则不接受来自 服务过程中,所有状态更新消息都将被忽略。如果 ,则仅服务 接受从服务主进程发送的更新。苟 接受从源自其中一个命令的任何主进程或控制进程发送的服务更新。如果 ,则所有服务都从 接受服务控制组的所有成员。此选项应设置为对 使用 / 或时的通知套接字(见上文)。如果使用了这些选项但未配置,则将隐式设置为 。nonemainexecallnonemainexecExec*=allType=notifyType=notify-reloadWatchdogSec=NotifyAccess=main

请注意,只有在以下情况下,通知才能正确地归因于单位 在 PID 1 处理消息时,发送进程仍然存在,或者如果发送进程 由服务管理器显式运行时跟踪。如果服务管理器最初 分叉了进程,即在所有匹配或 的进程上。相反,如果单元的辅助进程发送消息并立即退出,则服务管理器可能无法 正确地将消息归因于该单元,因此将忽略它,即使为它设置了消息。sd_notify()mainexecsd_notify()NotifyAccess=all

因此,为了消除所有涉及查找客户端单位和通知归属的竞争条件 正确使用单位。此调用充当同步点 并确保在此调用之前发送的所有通知在返回时都已由服务管理器拾取 成功。对于未被 服务管理器,否则此同步机制对于将通知归因于 单位。sd_notify_barrier()sd_notify_barrier()

Sockets=
指定 this 的套接字单元的名称 service 应继承套接字文件描述符,当 服务已启动。通常,应该没有必要使用 此设置,作为其单元共享的所有套接字文件描述符 与服务名称相同(以不同单位为准) name 后缀)被传递给 spawned 过程。

请注意,可以传递相同的套接字文件描述符 同时到多个进程。另请注意,一个 可以在传入的套接字流量上激活不同的服务 而不是最终配置为继承 套接字文件描述符。或者,换句话说:单位的设置不必与 与它所指的设置相反。Service=.socketSockets=.service

此选项可能会出现多次,在这种情况下,套接字单元列表将被合并。注意 一旦设置,再次清除套接字列表(例如,通过将空字符串分配给 this 选项)

FileDescriptorStoreMax=
配置在服务管理器中可以存储多少个文件描述符 使用 sd_pid_notify_with_fds(3) 的服务 “” 消息。这对于实现可以重新启动的服务非常有用 在显式请求或崩溃后,不会丢失状态。任何打开的套接字和其他文件 在重新启动期间不应关闭的描述符可以以这种方式存储。应用程序状态 可以序列化为 中的文件,也可以存储在 memfd_create(2) 内存文件描述符中。默认值为 0,即服务中不能存储任何文件描述符 经理。从特定服务传递到服务管理器的所有文件描述符都将传回 在下次服务重新启动时,将服务主进程(参见 sd_listen_fds(3) 有关使用的精确协议以及文件描述符传递顺序的详细信息)。任何 传递给服务管理器的文件描述符在看到或出现在服务管理器上时,或者当服务被关闭时,将自动关闭 完全停止,并且没有作业排队或正在执行(后者可以进行调整,请参见下文)。如果使用此选项,则应(见上文)设置为打开对通知套接字的访问 由 systemd 提供。如果未设置,则将其隐式设置为 。FDSTORE=1RuntimeDirectory=POLLHUPPOLLERRFileDescriptorStorePreserve=NotifyAccess=NotifyAccess=main

systemd-analyze(1) 的 fdstore 命令可用于列出服务文件描述符存储的当前内容。

请注意,服务管理器将仅传递文件描述符中包含的文件描述符 存储到服务自己的进程中,从不通过 IPC 或类似方式存储到其他客户端。但是,它确实如此 允许非特权客户端查询当前打开的文件描述符列表 服务。因此,敏感数据可以安全地放置在引用的文件中,但不应 附加到存储文件的元数据(例如包含在文件名中) 描述 符。

如果此选项设置为非零值,则环境变量 将为为此服务调用的进程设置。参见 systemd.exec(5) 详。$FDSTORE

有关文件描述符存储的详细信息,请参阅文件描述符存储概述。

在版本 219 中添加。

FileDescriptorStorePreserve=
采用 、 之一,并控制何时释放服务的文件描述符存储 (即何时关闭包含的文件描述符(如果有)。如果设置为 当服务停止时,文件描述符存储会自动释放;如果(默认值)只要设备既不处于非活动状态,它就会一直存在 NOR 失败,或者作业排队等待服务,或者服务需要重新启动。如果文件描述符存储一直存在,直到将设备从 内存(即不再被引用且处于非活动状态)。后者可用于将条目保留在 文件描述符存储固定,直到 Service Manager 退出。noyesrestartnorestartyes

使用 systemctl clean --what=fdstore ... 释放文件描述符存储 明确地。

在版本 254 中添加。

USBFunctionDescriptors=
配置包含 USB 的文件的位置 FunctionFS 描述符,用于实现 USB 小工具功能。这仅与 已配置的插座单元。此文件的内容在 打开。ListenUSBFunction=ep0

在版本 227 中添加。

USBFunctionStrings=
配置包含以下内容的文件的位置 USB FunctionFS 字符串。行为与上述类似。USBFunctionDescriptors=

在版本 227 中添加。

OOMPolicy=
为内核和用户空间 OOM 配置内存不足 (OOM) 终止策略 杀手级 systemd-oomd.service(8)。 在 Linux 上,当内存变得稀缺到内核无法分配内存时 本身,它可能会决定终止正在运行的进程以释放内存并减少内存 压力。请注意,这是一个更灵活的解决方案,旨在 为了防止用户空间(而不仅仅是内核)出现内存不足的情况,请尝试 在内核必须采取行动之前提前终止服务。systemd-oomd.service

此设置采用 或 之一。如果设置为 和 单位中的进程是 被 OOM 杀手杀死,这被记录下来,但单位继续运行。如果设置为,则会记录事件,但设备会被服务干净地终止 经理。如果设置为 并且单元的某个进程被 OOM 终止 killer 内核被指示也杀死该单元的所有剩余进程,方法是将属性设置为 ;另见内核 页面控制组 v2。continuestopkillcontinuestopkillmemory.oom.group1

systemd-system.conf(5) 中的设置默认设置为 ,但 units where is open 除外,默认为 .DefaultOOMPolicy=Delegate=continue

使用设置来配置单元的进程 应被视为 Linux OOM 终止进程的首选或不太首选的候选者 杀手锏。参见 systemd.exec(5) 详。OOMScoreAdjust=

这个设置也适用于 systemd-oomd.service(8)。 与内核执行的内核 OOM 终止类似,此设置确定 systemd-oomd 之后的单元会杀死与之关联的 cgroup。

在版本 243 中添加。

OpenFile=
采用 “” 形式的参数, 哪里:path[:fd-name:options]

"path“是文件系统中文件或套接字的路径;AF_UNIX
"fd-name“是将与文件描述符关联的名称; 名称可以包含任何 ASCII 字符,但必须排除控制字符和 “:”,并且长度不得超过 255 个字符; 它是可选的,如果未提供,则默认为文件名;
"options“是以逗号分隔的访问选项列表; 可能的值为 "", "", "", ""; 如果未指定,文件将在模式下打开; 如果指定了 “”,则忽略文件/套接字打开期间的错误。 多次指定同一选项将被视为错误。read-onlyappendtruncategracefulrwgraceful
文件或套接字由服务管理器打开,文件描述符将传递给服务。 如果路径是套接字,我们调用它。 参见 sd_listen_fds(3) 来了解如何检索这些文件描述符的更多细节。connect()

此设置可用于允许服务访问它们无法自行访问的文件/套接字 (由于在单独的挂载命名空间中运行,没有权限,...

可以多次指定此设置,在这种情况下,将打开所有指定的路径,并将文件描述符传递给服务。 如果分配了空字符串,则将重置在此之前定义的打开文件的整个列表。

在版本 253 中添加。

ReloadSignal=
配置 UNIX 进程信号,以便在询问时发送到服务的主进程 以重新加载服务的配置。缺省值为 .此选项没有 除非使用,否则效果,请参阅 以上。SIGHUPType=notify-reload

在版本 253 中添加。

查看 systemd.unit(5)、systemd.exec(5) 和 systemd.kill(5) 了解更多信息 设置。

命令行
本节介绍命令行解析和 变量和说明符替换 、 、 、 和 选项。ExecStart=ExecStartPre=ExecStartPost=ExecReload=ExecStop=ExecStopPost=

多个命令行可以通过用分号分隔它们来连接在单个指令中 (这些分号必须作为单独的单词传递)。独分号可以转义为 "".\;

每个命令行都使用 systemd.syntax(7) 的 “引用” 部分所描述的规则不加引号。这 第一项成为要执行的命令,后续项成为参数。

此语法的灵感来自 shell 语法,但只有元字符和扩展 理解以下段落中的描述,变量的扩展是 不同。具体来说,重定向使用 "", "", “”和 “”,管道使用 “”,在后台运行程序 “”,以及 shell 的其他元素 不支持语法。<<<>>>|&

要执行的命令可以包含空格,但不允许使用控制字符。

每个命令都可以以许多特殊字符为前缀:

表 2.特殊可执行文件前缀

前缀	影响
"@"	如果可执行路径以 “” 为前缀,则第二个指定的令牌将传递给已执行的进程(而不是实际的文件名),后跟指定的其他参数。@argv[0]
"-"	如果可执行路径以“”为前缀,则记录通常被视为失败的命令的退出代码(即非零退出状态或由于信号导致的异常退出),但没有进一步的影响,并被视为等同于成功。-
":"	如果可执行文件路径以“”为前缀,则不会应用环境变量替换(如下面的“命令行”部分所述)。:
"+"	如果可执行路径以“”为前缀,则以完全权限执行进程。在此模式下,配置了 、 或各种文件系统命名空间选项(如 、)的权限限制不会应用于调用的命令行(但仍会影响任何其他 、 、 ...行)。但是,请注意,这不会绕过适用于整个控制组的选项,例如,请参阅 systemd.resource-control(5) 以获取完整列表。+User=Group=CapabilityBoundingSet=PrivateDevices=PrivateTmp=ExecStart=ExecStop=DevicePolicy=
"!"	与上面讨论的 “” 字符类似,这允许使用提升的权限调用命令行。但是,与 “” 不同的是,“” 字符仅更改 和 的效果,即仅更改影响用户和组凭据的节。请注意,此设置可以与 结合使用,在这种情况下,会在调用命令之前分配动态用户/组对,但凭据更改留给已执行的进程本身。++!User=Group=SupplementaryGroups=DynamicUser=
"!!"	此前缀与 “” 非常相似,但是它只对不支持环境进程功能的系统有影响,即不支持 。它旨在用于利用环境功能以尽可能以最低权限运行进程的单元文件,同时与缺乏环境功能支持的系统保持兼容。请注意,当使用 “” 并检测到缺少环境功能支持的系统时,会隐式修改任何配置和节,以允许生成的进程本身删除凭据和功能,即使这配置为不允许也是如此。此外,如果使用此前缀,并且检测到缺少环境功能的系统,则将跳过并且不应用支持。在支持环境功能的系统上,“”不起作用,并且是冗余的。!AmbientCapabilities=!!SystemCallFilter=CapabilityBoundingSet=AmbientCapabilities=!!

"@“, ”“, ”“和其中之一 “”/“”/“”可以一起使用,它们可以出现在任何 次序。但是,只能在 时间。-:+!!!+!!!

对于每个命令,第一个参数必须是可执行文件的绝对路径或简单路径 文件名不带任何斜杠。如果命令不是完整(绝对)路径,则将其解析为 使用编译时确定的固定搜索路径的完整路径。搜索的目录包括 、 、 on 使用 split 和 目录的系统,以及使用 split 和 的系统上的对应系统。因此,在可执行文件的情况下,仅使用可执行文件名称是安全的 位于任何“标准”目录中,并且在其他情况下必须使用绝对路径。 提示:可以使用 systemd-path search-binaries-default 查询此搜索路径。/usr/local/bin//usr/bin//bin//usr/bin//bin/sbin/bin/sbin/

命令行接受 systemd.unit(5) 中描述的 “” 说明符。%

支持基本环境变量替换。用 “”作为单词的一部分,或作为其单词的单词 own,在这种情况下,它将被擦除和替换 通过环境变量(如果有)的确切值,包括所有 它包含的空格,总是只生成一个参数。 在命令行中使用 “” 作为单独的单词,在 在这种情况下,它将被环境的价值所取代 变量在空格处拆分,导致零个或多个参数。 对于这种类型的扩展,拆分时会尊重引号 变成文字,然后删除。${FOO}$FOO

例:

Environment="ONE=one" 'TWO=two two'
ExecStart=echo $ONE $TWO ${TWO}
这将执行 /bin/echo 和 4 参数: “”, “”, “” 和 “”。onetwotwotwo two

例:

Environment=ONE='one' "TWO='two two' too" THREE=
ExecStart=/bin/echo ${ONE} ${TWO} ${THREE}
ExecStart=/bin/echo $ONE $TWO $THREE
这导致 调用两次,第一次带参数 "", "", "", 第二次是有争论 "", "", ""./bin/echo'one''two two' tooonetwo twotoo

若要传递文字美元符号,请使用 “”。 处理在展开时值未知的变量 作为空字符串。请注意,第一个参数(即程序 执行)可能不是变量。$$

以这种方式使用的变量可以通过 和 来定义。此外,列出的变量 在 systemd.exec(5) 的 “生成进程中的环境变量” 一节中, 这些被认为是“静态配置”,可以使用(这个 包括例如,但不包括 )。Environment=EnvironmentFile=$USER$TERM

请注意,不直接支持 shell 命令行。如果 shell 命令行,它们需要传递 显式转换为某种类型的 shell 实现。例:

ExecStart=sh -c 'dmesg | tac'
例:

ExecStart=echo one ; echo "two two"
这将执行 echo 两次, 每次都有一个参数:“”和 “”,分别。因为两个命令是 指定,必须使用。onetwo twoType=oneshot

例:

Type=oneshot
ExecStart=:echo $USER ; -false ; +:@true $TEST
这将使用文本参数执行 /usr/bin/echo “”(“” 抑制变量扩展),然后是 /usr/bin/false(返回值将被忽略,因为 “” 禁止检查返回值)和 /usr/bin/true(使用提升的权限, 将 “” 作为 )。$USER:-$TESTargv[0]

例:

ExecStart=echo / >/dev/null & \; \
ls
这将使用五个参数执行 echo:“”, "", “”、“”和 ""./>/dev/null&;ls

例子
例 2.服务简单

以下单元文件创建一个服务,该服务将 执行。由于指定了 no,因此将假定为默认值。 systemd 将假定该单元在 程序已开始执行。/usr/sbin/foo-daemonType=Type=simple

[Unit]
Description=Foo

[Service]
ExecStart=/usr/sbin/foo-daemon

[Install]
WantedBy=multi-user.target
请注意,systemd 在这里假设进程由 systemd 将继续运行,直到服务终止。如果 程序 daemonizes itself(即 forks),请改用。Type=forking

由于未指定, systemd 会将 SIGTERM 发送到从这里开始的所有进程 服务,并在超时后也 SIGKILL。此行为可以是 修改后,详见 systemd.kill(5)。ExecStop=

请注意,此单元类型不包括服务完成时的任何类型的通知 初始化。为此,您应该使用其他单元类型,例如 / 如果服务理解 systemd 的通知协议,如果服务可以在后台运行,或者如果单元在初始化后获取 DBus 名称 完成。见下文。Type=notifyType=notify-reloadType=forkingType=dbus


例 3.Oneshot服务

有时,单位应该只执行一个动作,而不 保持活动进程,例如文件系统检查或 启动时的清理操作。为此,存在。单位 此类型将等到指定的进程终止 然后回退到非活动状态。以下单元将 执行清理操作:Type=oneshot

[Unit]
Description=Cleanup old Foo data

[Service]
Type=oneshot
ExecStart=/usr/sbin/foo-cleanup

[Install]
WantedBy=multi-user.target
请注意,systemd 会将该单元视为 状态为“正在启动”,直到程序终止,如此订购 依赖项将等待程序完成后再启动 他们自己。设备将在以下时间后恢复到“非活动”状态 执行完成,永远不会达到“活动”状态。那 表示启动设备的另一个请求将执行该操作 再。

Type=oneshot是 仅限可能指定了多个服务单元的服务单元。对于具有多个 commands (),所有命令将再次运行。ExecStart=Type=oneshot

对于 ,并且是不允许的。Type=oneshotRestart=alwaysRestart=on-success


例 4.Stoppable oneshot 服务

与一次性服务类似,有时有 需要执行程序来设置某些东西的单元,以及 然后执行另一个以将其关闭,但没有进程保留 当它们被视为“已启动”时处于活动状态。网络 配置有时可能属于此类别。另一种用途 情况是,如果 oneshot 服务不能每次都执行 当它们作为依赖项被拉入时,但只是第一个 时间。

为此,systemd 知道设置 ,其中 导致 systemd 在启动时将设备视为活动状态 操作已成功退出。该指令可用于所有 类型,但对 和 最有用。使用 , systemd 等待 直到 Start 操作完成,然后才会考虑 单元处于活动状态,因此依赖项仅在启动后启动 操作已成功。使用 、 依赖项 将在启动操作后立即启动 派出。以下单元提供了一个简单的示例 静态防火墙。RemainAfterExit=yesType=oneshotType=simpleType=oneshotType=simple

[Unit]
Description=Simple firewall

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/sbin/simple-firewall-start
ExecStop=/usr/local/sbin/simple-firewall-stop

[Install]
WantedBy=multi-user.target
由于该装置在启动后被认为正在运行 操作已退出,再次在该设备上调用 systemctl start 将导致不执行任何操作。


例 5.传统分叉服务

许多传统的守护进程/服务背景(即 fork, daemonize) 自己。在 服务的单元文件来支持此操作模式。systemd的 将认为服务正在初始化过程中 而原始程序仍在运行。一旦退出 成功,并且至少保留一个进程(和 ),, 服务被视为已启动。Type=forkingRemainAfterExit=no

通常,传统守护程序仅包含一个进程。 因此,如果在原始进程之后只剩下一个进程 进程终止时,systemd 会将该进程视为主进程 服务的过程。在这种情况下,变量将在 , , 中可用 等。$MAINPIDExecReload=ExecStop=

如果剩下多个进程,systemd 将是 无法确定主进程,因此不会假设 有一个。在这种情况下,不会 扩展到任何内容。但是,如果进程决定编写 传统的PID文件,systemd将能够读取主PID 从那里。请进行相应设置。 请注意,守护程序应在完成之前写入该文件 随着它的初始化。否则,systemd 可能会尝试读取 文件。$MAINPIDPIDFile=

以下示例显示了一个简单的守护程序,该守护程序分叉和 只需在后台启动一个进程:

[Unit]
Description=Some simple daemon

[Service]
Type=forking
ExecStart=/usr/sbin/my-simple-daemon -d

[Install]
WantedBy=multi-user.target
请参见 systemd.kill(5) 来了解 systemd 终止方式的细节 服务。


例 6.DBus 服务

对于在 DBus 系统总线上获取名称的服务, 相应地使用和设置。该服务不应 fork(守护进程)。systemd 会认为该服务是 在系统总线上获取名称后进行初始化。 以下示例显示了一个典型的 DBus 服务:Type=dbusBusName=

[Unit]
Description=Simple DBus service

[Service]
Type=dbus
BusName=org.example.simple-dbus-service
ExecStart=/usr/sbin/simple-dbus-service

[Install]
WantedBy=multi-user.target
对于总线可激活的服务,请勿 在 systemd 中包含 [Install] 部分 服务文件,但使用相应 DBus 服务文件中的选项,例如 ():SystemdService=/usr/share/dbus-1/system-services/org.example.simple-dbus-service.service

[D-BUS Service]
Name=org.example.simple-dbus-service
Exec=/usr/sbin/simple-dbus-service
User=root
SystemdService=simple-dbus-service.service
请参见 systemd.kill(5) 来了解 systemd 终止方式的细节 服务。


例 7.通知 systemd 有关其初始化的服务

Type=simple服务确实很容易编写,但具有 systemd 的主要缺点是无法判断给定服务的初始化时间是 完成。出于这个原因,systemd 支持一个简单的通知协议,该协议允许守护进程使 systemd 知道它们已完成初始化。为此使用 或。此类的典型服务文件 守护进程将如下所示:Type=notifyType=notify-reload

[Unit]
Description=Simple notifying service

[Service]
Type=notify
ExecStart=/usr/sbin/simple-notifying-service

[Install]
WantedBy=multi-user.target
请注意,守护进程必须支持 systemd 的通知 协议,否则 systemd 会认为服务尚未启动 并在暂停后杀死它。有关如何更新的示例 守护进程要透明地支持这个协议,请看sd_notify(3)。 systemd 会认为设备处于“启动”状态 直到就绪通知到达。

请参见 systemd.kill(5) 来了解 systemd 终止方式的细节 服务。


另见
systemd(1)、systemctl(1)、systemd-system.conf(5)、systemd.unit(5)、systemd.exec(5)、systemd.resource-control(5)、systemd.kill(5)、systemd.directives(7)、systemd-run(1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值