特定检查返回 RC 0 后启动 systemd 服务

特定检查返回 RC 0 后启动 systemd 服务

在使用 systemd 启动系统时,有一个服务可以成功启动。一段时间后,该服务将特定配置应用于系统。

一次应用该配置后,我想启动另一个服务,例如 crond。有一个命令可以验证配置是否已应用。一旦该命令返回返回码 0,则另一个服务 crond 必须启动。

命令示例:

grep something file.txt# 这可能是一张支票。如果 file.txt 中有“something”,则返回 RC 0。

我无法使用After=Before=,因为配置是在服务启动后应用的。这不是即时的,可能需要长达 30 秒的时间。

问:如何配置 systemd 服务在某个检查的返回码为 0 后启动?

答案1

比方说foo制作使用的配置bar

foo.service:

[Unit]
Description=Configuration Service
Before=bar.service

[Service]
Type=notify
ExecStart=/path/to/script

然后/path/to/script包含:

#!/bin/bash

/usr/locan/bin/do_configuration.sh

# Make sure the configuration is actually valid
if grep -q something file.txt; then

# send a signal to systemd that the unit is good. 
  systemd-notify --ready

# systemd will continue to launch dependent services
  exit 0

else
  systemd-notify ERRNO=2
  exit 1
fi

我认为值得尝试一下。 ARequiredBy=WantedBy=依赖项也可能是必要的。


ExecStartPre=另一种选择是在of中使用它bar.service

#!/bin/bash
while :
do
   if grep -q something file.txt
   then
    break
   fi
done

但我不喜欢这个选项,因为:

  1. 它不断地进行不必要的轮询
  2. 如果您尝试systemctl start bar,systemctl 将挂起,直到满足条件为止

答案2

您可以使用结合使用 systemd 服务BeforeExecStart重新启动选项(用于RestartSec避免多次尝试)。

[Unit]
Description=Foo
Before=the other service

[Service]
ExecStart=grep -q something file.txt
Restart=on-failure
RestartSec=10s

但最好让您的配置系统触发下一个服务,而不是轮询/grep 文件。

相关内容