我正在尝试使 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
Run Code Online (Sandbox Code Playgroud)
有什么建议吗?
长话短说:
\nConditionHost=|HostOne*\nConditionHost=|HostTwo*\nRun Code Online (Sandbox Code Playgroud)\n您可以使用 轻松检查您的条件systemd-analyze。这应该会加快你的测试速度。
ConditionHost这是我在自己的机器上使用的示例( stewbian)。
在这里,我成功地进行了精确匹配。
\n$ systemd-analyze condition ConditionHost=stewbian\ntest.service: ConditionHost=stewbian succeeded.\nConditions succeeded\nRun Code Online (Sandbox Code Playgroud)\n在这里,我成功进行了全局匹配
\n$ systemd-analyze condition ConditionHost=stew*\ntest.service: ConditionHost=stew* succeeded.\nConditions succeeded.\nRun Code Online (Sandbox Code Playgroud)\n在这里,我正确地失败了,因为匹配不正确
\n$ systemd-analyze condition ConditionHost=machine2\ntest.service: ConditionHost=machine2\nRun Code Online (Sandbox Code Playgroud)\n因此,首先,我们可以说您的测试可以与 一起使用ConditionHost=Host*,但我怀疑您想要更精确。
\n\n如果指定了多个条件,则如果所有条件都适用(即应用逻辑 AND),则将执行该单元。
\n
因此,多个条件应该在单独的行上,但它们将被AND\'d,所以它会失败
\n$ systemd-analyze condition "ConditionHost=machine2" "ConditionHost=stewbian"\ntest.service: ConditionHost=stewbian succeeded.\ntest.service: ConditionHost=machine2 failed.\nConditions failed.\n\nRun Code Online (Sandbox Code Playgroud)\n但手册页继续:
\n\n\n条件检查可以在等号后使用管道符号(“|”)(“Condition\xe2\x80\xa6=|\xe2\x80\xa6”),这会导致条件成为触发条件。如果为一个单元定义了至少一个触发条件,则如果该单元的至少一个触发条件适用且所有常规(即非触发)条件适用,则该单元将被启动。
\n
因此,ConditionHost=|在每个条件上使用,条件将进行“或”运算:
$ systemd-analyze condition "ConditionHost=|machine2" "ConditionHost=|stewbian"\ntest.service: ConditionHost=|stewbian succeeded.\ntest.service: ConditionHost=|machine2 failed.\nConditions succeeded.\nRun Code Online (Sandbox Code Playgroud)\n您还可以包含 glob:
\n$ systemd-analyze condition \\\n "ConditionHost=|stew*" \\\n "ConditionHost=|machine*"\ntest.service: ConditionHost=|machine* failed.\ntest.service: ConditionHost=|stew* succeeded.\nConditions succeeded.\nRun Code Online (Sandbox Code Playgroud)\n在您的文件中,使用:
\nConditionHost=|HostOne*\nConditionHost=|HostTwo*\nRun Code Online (Sandbox Code Playgroud)\n我可以看到你想做什么。文档确实说:
\n\n\n这要么采用一个主机名字符串(可选地使用 shell 样式的 glob),该字符串针对本地设置的主机名进行测试...
\n
如果我们看一下,man 7 glob我们会读到:
\n\n如果字符串包含字符 \'?\'、\'*\' 或 \'[\' 之一,则该字符串是通配符模式。通配符是将通配符模式扩展为与该模式匹配的路径名列表的操作。
\n
在这个定义中, 和|都不{...}被认为是全局的。虽然systemd{...}可能被认为是一个通用的bashglob,但它不是 bash 并且不使用该定义。
| 归档时间: |
|
| 查看次数: |
632 次 |
| 最近记录: |