他のサービスが開始または再ロードされると、Systemd Unitサービスが再起動されます。

他のサービスが開始または再ロードされると、Systemd Unitサービスが再起動されます。

可能であれば、システムのインストールとアップグレードを編集せずに起動時にSystemdrestart()または再ロード(設定のみを再ロード)する方法があるかどうかを知りたいです。A.serviceAfterB.serviceB.service

A.serviceB.serviceインストールされていない、無効になっている、または停止した場合でも起動する必要があります。

A.service:

[Unit]
After = B.service network-online.target
Wants = B.service

[Service]
Type=oneshot
ExecStart = /script.sh start
ExecStop = /script.sh stop
RemainAfterExit=yes

[Install]
WantedBy = network-online.target

B.service:

[Unit]
After=syslog.target network.target

[Service]
Type=forking
ExecStart=/cmd start
ExecStop=/cmd stop
ExecReload=/cmd reload
PIDFile=/var/run/cmd.pid

[Install]
WantedBy=multi-user.target

答え1

PartOfこのセクションを使用できます[Unit]

例:PartOf=B.service

マニュアルページでは、

部分=

依存関係の設定はRequires =に似ていますが、デバイスを停止して再起動することに制限されています。 systemdがここにリストされているデバイスを停止または再起動すると、ジョブはそのデバイスに伝播されます。これは一方向の依存関係です。このデバイスを変更しても、リストされているデバイスには影響しません。

答え2

stop私はwithを制御できずPartOf=Awithを止めることはできませんでしたB。それで結局は次のようになりました。仕入先設定の上書き、うまくいくようです。

/etc/systemd/system/B.service.d/override.conf

[Service]
ExecStart=
ExecStart=/bin/sh -c '/cmd start || exit $?; sleep 5; [ -x /script.sh ] && /script.sh start; exit 0'
ExecReload=
ExecReload=/bin/sh -c '/cmd reload || exit $?; sleep 5; [ -x /script.sh ] && /script.sh start; exit 0'

/cmd実装は非同期であり、リソースにアクセスするにはアクセスも必要であり/script.sh(まだ)、数秒間眠るより良い方法が見つかりませんでした。

systemctl [--no-block] try-restart自分で使う前に試してみましたが、/script.sh成功しませんでした。

答え3

現時点では、systemdはこの状況に対処していません。この機能はサービスファイルだけでは不可能です。 1つの可能性は、同じ名前のシェルスクリプトを介してsystemctlをハイジャックし、その中でB.serviceが再起動/起動または再ロードされることを確認し、A.serviceで適切なタスクを実行し、必要に応じてrc.localを更新することです。です。正しい状態は次のとおりです。起動時にも達成されました。 docker.serviceとnetwork.serviceにこの問題がありますが、常に一緒に再起動します。

systemctl 再起動 docker.servicenetworking.service

明らかに、systemd自体がB.serviceを内部的に(たとえば、他のサービスファイルを介して)動作している場合は機能しません。

関連情報