2つのサービスがあります。 1つはコアサービスで、もう1つは本質的にコアサービスを監督するサービスです。ライフサイクルは次のように指定されます。
- 監視サービスは、コアサービスの開始時に開始する必要があります。
- コアサービスが失敗しても、Overwatchサービスはアクティブなままにしてください。
core
これらの制約を2つのシステムサービスとして実装することは、2つの別々のサービスを作成して開始するのと同じくらい簡単ですoverwatch
。
core.service
[Unit]
Description=Some Core Service
Wants=overwatch.service
[Service]
Type=forking
ExecStart=/some/core/executable
# ...
overwatch.service
[Unit]
Description=Some Overwatch Service
[Service]
Type=simple
ExecStart=/some/overwatch/executable
# ...
しかし、私は別の制限:起動core
中はoverwatch
サービスを有効にできません。私が試した解決策は、overwatch
始める直前に停止してcore
再起動することでしたoverwatch
。そのために、次のようにサービスにExecStartPre
ディレクティブをBefore
追加してみましたcore
。
[Unit]
Description=Some Core Service
Wants=overwatch.service
Before=overwatch.service
[Service]
Type=forking
ExecStart=/some/core/executable
ExecStartPre=+systemctl stop overwatch.service
# ...
今overwatch
死んでもまだ生きていますが、core
再起動する前に正常に停止します。ただし、ディレクティブのため、core
成功した起動後もsystemdが再起動すると予想されます。core
Wants
Before
しかし、そのようなことは起こりませんでした。。
何する効果があったのは、ディレクティブで手動で再起動することでしたExecStartPost
。
[Unit]
Description=Some Core Service
[Service]
Type=forking
ExecStart=/some/core/executable
ExecStartPre=+systemctl stop overwatch.service
ExecStartPost=+systemctl start overwatch.service
# ...
しかし、もっと良い方法があるかどうか疑問に思います。他のサービスを手動で停止して開始するには、事前および後の起動フックを使用するよりも、推奨される説明的な方法で私の要件を表現する方が良いです。