
複数のホスト名パターンに基づいて条件付きでシステムサービスを開始しようとしています。
私はこれを試しましたが、運がありませんでした。
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*
より正確にしたいようです。
~からman systemd.unit
:
複数の条件が指定されている場合、すべての条件が適用されると(つまり、論理ANDが適用されると)単位が実行されます。
したがって、複数の条件は別々の行にある必要がありますが、ANDで接続されて失敗します。
$ systemd-analyze condition "ConditionHost=machine2" "ConditionHost=stewbian"
test.service: ConditionHost=stewbian succeeded.
test.service: ConditionHost=machine2 failed.
Conditions failed.
ただし、マニュアルページは続きます。
条件チェックでは、条件をトリガー条件にする等号(「Condition...=|...」)の後に垂直バー記号(「|」)を使用できます。デバイスに1つ以上のトリガ条件が定義されている場合は、そのデバイスに1つ以上のトリガ条件が適用され、すべての一般的な(つまりトリガされていない)条件が適用されると、デバイスが起動します。
したがって、ConditionHost=|
各条件を使用すると、条件はORに関連付けられます。
$ systemd-analyze condition "ConditionHost=|machine2" "ConditionHost=|stewbian"
test.service: ConditionHost=|stewbian succeeded.
test.service: ConditionHost=|machine2 failed.
Conditions succeeded.
次のようにグローブを含めることもできます。
$ systemd-analyze condition \
"ConditionHost=|stew*" \
"ConditionHost=|machine*"
test.service: ConditionHost=|machine* failed.
test.service: ConditionHost=|stew* succeeded.
Conditions succeeded.
ファイルで次を使用します。
ConditionHost=|HostOne*
ConditionHost=|HostTwo*
私はあなたがしたいことを知ることができます。これ文書 説明する:
これはホスト名文字列です(オプションでシェルスタイルのグローブを使用する)これはローカルに設定されたホスト名に対してテストされています...
私たちが見るとman 7 glob
私達は読みます:
文字列に「?」、「*」、または「[」文字のいずれかが含まれている場合は、ワイルドカードパターンです。ワイルドカード割り当ては、ワイルドカードパターンをパターンと一致するパス名のリストに拡張する操作です。
この定義では、両方ともグローバルと見なされ|
ません{...}
。 systemdは{...}
一般的なbash
globと見なすことができますが、bashではなく、その定義を使用しません。