我正在尝试使 systemd 服务基于多个主机名模式有条件启动。
我尝试过这个但没有运气:
root@linkbox-BI034415:/# systemctl cat mcbapp
# /lib/systemd/system/myservice.service
[Unit]
Description=My Service
Wants=another.service
After=another.service
ConditionHost=HostOne*|HostTwo*
Also tried
ConditionHost={HostOne*,HostTwo*}
[Service]
EnvironmentFile=/etc/default/myenv
ExecStart=/opt/bin/my-apps
Restart=on-failure
[Install]
WantedBy=multi-user.target
有什么建议吗?
答案1
长话短说:
ConditionHost=|HostOne*
ConditionHost=|HostTwo*
您可以使用 轻松检查您的条件systemd-analyze
。这应该会加快你的测试速度。
ConditionHost
这是我在自己的机器上使用的示例( stewbian
)。
在这里,我成功地进行了精确匹配。
$ systemd-analyze condition ConditionHost=stewbian
test.service: ConditionHost=stewbian succeeded.
Conditions succeeded
在这里,我成功进行了全局匹配
$ systemd-analyze condition ConditionHost=stew*
test.service: ConditionHost=stew* succeeded.
Conditions succeeded.
在这里,我正确地失败了,因为匹配不正确
$ systemd-analyze condition ConditionHost=machine2
test.service: ConditionHost=machine2
因此,首先,我们可以说您的测试可以与 一起使用ConditionHost=Host*
,但我怀疑您想要更精确。
如果指定了多个条件,则如果所有条件都适用(即应用逻辑 AND),则将执行该单元。
因此,多个条件应该在单独的行上,但它们将进行 AND 运算,因此会失败
$ systemd-analyze condition "ConditionHost=machine2" "ConditionHost=stewbian"
test.service: ConditionHost=stewbian succeeded.
test.service: ConditionHost=machine2 failed.
Conditions failed.
但手册页继续:
条件检查可以在等号(“Condition…=|…”)后使用竖线符号(“|”),这使得该条件成为触发条件。如果为一个单元定义了至少一个触发条件,则如果该单元的至少一个触发条件适用且所有常规(即非触发)条件适用,则该单元将被启动。
因此,ConditionHost=|
在每个条件上使用,条件将进行“或”运算:
$ systemd-analyze condition "ConditionHost=|machine2" "ConditionHost=|stewbian"
test.service: ConditionHost=|stewbian succeeded.
test.service: ConditionHost=|machine2 failed.
Conditions succeeded.
您还可以包含 glob:
$ systemd-analyze condition \
"ConditionHost=|stew*" \
"ConditionHost=|machine*"
test.service: ConditionHost=|machine* failed.
test.service: ConditionHost=|stew* succeeded.
Conditions succeeded.
在您的文件中,使用:
ConditionHost=|HostOne*
ConditionHost=|HostTwo*
我可以看到你想做什么。这文档 说:
这要么采用主机名字符串(可选择使用 shell 样式的 glob)这是针对本地设置的主机名进行测试的...
如果我们看一下man 7 glob
我们读:
如果字符串包含字符“?”、“*”或“[”之一,则该字符串是通配符模式。通配符是将通配符模式扩展为与该模式匹配的路径名列表的操作。
在这个定义中, 和 都不|
被{...}
认为是全局的。虽然systemd{...}
可能被认为是一个常见的bash
glob,但它不是 bash 并且不使用该定义。