在使用 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
但我不喜欢这个选项,因为:
- 它不断地进行不必要的轮询
- 如果您尝试
systemctl start bar
,systemctl 将挂起,直到满足条件为止
答案2
您可以使用结合使用 systemd 服务Before
和ExecStart
重新启动选项(用于RestartSec
避免多次尝试)。
[Unit]
Description=Foo
Before=the other service
[Service]
ExecStart=grep -q something file.txt
Restart=on-failure
RestartSec=10s
但最好让您的配置系统触发下一个服务,而不是轮询/grep 文件。