我想在文件存在的情况下延迟服务的启动(而不是在文件存在的情况下使服务失败,如ConditionPathExists=
),但在单元中没有找到任何内容文档
systemd 在技术上可行吗?如何 ?
答案1
据我所知,ConditionPathExists=
不会使设备进入“失败”状态。ConditionPathExists=
仅跳过该单元。
单元文件还可能包括许多 Condition…= 和 Assert…= 设置。在单元启动之前,systemd 将验证指定的条件是否成立。如果没有,设备的启动将被(大部分是静默地)跳过。失败条件不会导致设备进入“失败”状态。
ExecStartPre=
我发现根据文件的存在来延迟单元启动的一种方法是使用、thenRestart=on-failure
和测试文件RestartSec=
。这确实会使设备进入失败状态,但它会不断重试直到成功。例如:
[Service]
# Should cause failure if file exists
ExecStartPre=/usr/bin/test ! -f afile
ExecStart=mycommand
# Restart on failure. Keep trying to create backup.
RestartSec=10m
Restart=on-failure
答案2
仅使用一个单元
放入TimeoutStartSec=infinity
单元文件并ExecStart=
使用如下脚本进行配置
#! /bin/bash
TIMEOUT=1000
test -f /path/to/testfile && sleep "$TIMEOUT"
exec /path/to/service/binary plus arguments
这不能通过(以有用的方式)完成ExecStartPre=
,请参阅man systemd.service
:
请注意,ExecStartPre= 不能用于启动长时间运行的进程。通过 ExecStartPre= 调用的进程派生的所有进程都将在下一个服务进程运行之前被终止。
使用辅助单元
如果您想“单独”使用 systemd 来执行此操作,那么您可以创建一个辅助单元check_and_wait.target
。这一个获取条目
# check_and_wait.target
[Unit]
TimeoutStartSec=infinity
ConditionPathExists=/path/to/testfile
ExecStart=/usr/bin/sleep 1000
RemainAfterExit=yes
主单元获取这些条目:
Wants=check_and_wait.target
After=check_and_wait.target
答案3
[Service]
ExecStartPre=bash -c "while [ -f /path/to/file ]; do sleep 1; done"
ExecStart=your_command