如果文件存在则延迟 systemd 服务

如果文件存在则延迟 systemd 服务

我想在文件存在的情况下延迟服务的启动(而不是在文件存在的情况下使服务失败,如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

相关内容