i有一个SystemD单元,该单元格式化了云中的文件系统。
根据SystemD单元文档,存在许多不同的Condition*
参数,这些参数可以确定它们是否应该运行。我需要能够确定/dev/xvdb
是否格式化为Ext4,而我发现这样做的唯一方法是这样做:
if ! blkid -t TYPE=ext4 | grep xvdb >/dev/null; then
mkfs.ext4 /dev/xvdb
fi
虽然我可以在文件系统上的某个地方放置此bash脚本,但如果SystemD可以执行脚本来确定服务是否应有条件地启动。
,它似乎更加直观。是否有解决方案的解决方法,这不涉及在文件系统上删除文件?
我看到的唯一两个选择是:
- 在文件系统上删除bash脚本,该脚本总是在必要时返回0,仅返回格式。
- 使用
ExecStartPost
,touch
文件系统上的文件作为标签,然后用作ConditionPathExists=!/path
。
有没有办法让Systemd调用脚本来确定是否应该执行单元?
使用SystemD V243及以后(Post-#12933)您可以使用ExecCondition
:
ExecCondition=sh -c '! blkid -t TYPE=ext4 | grep -q xvdb'
注意SystemD如何解释命令行和特殊可执行前缀,在条件下可能有用(或令人惊讶)。