脚本状态的条件?

Naf*_*Kay 5 systemd

我有一个 SystemD 单元,用于格式化云中的文件系统。

根据systemd 单元文档,单元接受许多不同的Condition*参数来确定它们是否应该运行。我需要能够确定是否/dev/xvdb格式化为 ext4,我发现做到这一点的唯一方法是执行以下操作:

if ! blkid -t TYPE=ext4 | grep xvdb >/dev/null; then
    mkfs.ext4 /dev/xvdb
fi
Run Code Online (Sandbox Code Playgroud)

虽然我可以将此 bash 脚本放在文件系统上的某个位置,但如果 SystemD 可以执行脚本来确定服务是否应有条件启动,则看起来会更直观。

是否有解决方法,不涉及在文件系统上删除文件?

我看到的唯一两个选择是:

  1. 在文件系统上放置一个 bash 脚本,该脚本始终返回 0,并且仅在必要时进行格式化。
  2. 使用ExecStartPost,touch文件系统上的文件作为标记,然后ConditionPathExists=!/path.

有没有办法让 SystemD 调用脚本来确定它是否应该执行某个单元?

Kev*_*oid 2

对于 systemd v243 及更高版本( #12933之后),您可以使用ExecCondition

ExecCondition=sh -c '! blkid -t TYPE=ext4 | grep -q xvdb'
Run Code Online (Sandbox Code Playgroud)

请注意 systemd 如何解释命令行特殊的可执行前缀,这在某些情况下可能很有用(或令人惊讶)。