可能であれば、システムのインストールとアップグレードを編集せずに起動時にSystemd
restart()または再ロード(設定のみを再ロード)する方法があるかどうかを知りたいです。A.service
After
B.service
B.service
A.service
B.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=
、A
withを止めることはできませんでした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を内部的に(たとえば、他のサービスファイルを介して)動作している場合は機能しません。