別のサービスが開始またはリロードした場合、Systemd Unitサービスが再起動します


16

可能な場合は、システムによってインストールおよびアップグレードされる編集なしで、開始またはリロード(構成のリロードのみ)するときSystemdに再起動A.serviceAfter)する方法があるかどうかを知りたいです。B.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

回答:


12

あなたは使用することができますPartOf[Unit]セクション。

例: PartOf=B.service

manページから、

PartOf =

Requires =と同様の依存関係を設定しますが、ユニットの停止と再起動に限定されます。systemdがここにリストされているユニットを停止または再起動すると、アクションがこのユニットに伝播されます。これは一方向の依存関係であることに注意してください。このユニットを変更しても、リストされているユニットには影響しません。


おかげで、私はに探していたOverriding vendor settingsが、このルックスにもより簡単かつ有望な、唯一excpetionは、私はしたくないですA場合は停止しB、停止、ちょうどA.restartあればB.start、とにかく私はすぐにいくつかのテストをやると、それを管理するためのいくつかの方法がありますかどうかを確認し、その後、お知らせします
アレックス

@Alex:一緒に使用するPartOfとどうなりますRestart=alwaysか?
ゆえに16

私は見てよRestart=、私はと行動が何であるかわからないんだけど、ドキュメントoneshotサービス、関係なく:When the death of the process is a result of systemd operation (e.g. service stop or restart), the service will not be restarted私は手動でBを停止すると、Aを停止すると、正しく理解していれば、
アレックス

さて、賞金は期限切れのために自動的に割り当てられます。@ Thushiあなたの努力と提案に感謝しますがPartOf、とにかく楽しむための質問の解決策ではありません。
アレックス

@アレックス:ポイントは私にとって重要ではありません。ポイントを獲得できる方法は他にもたくさんあります。提供されたソリューションで問題が解決するかどうかを知りたいだけです。そうでない場合は、さらに作業を進めます。PartOfwith を使用してはRestart=alwaysどうですか?試しましたか?
ゆえに16

3

私は上で何のコントロールがなかったstopPartOf=、とAして停止してはいけない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が、機能しませんでした。


このシナリオのソリューションも探しています。このソリューションについてもう少し説明していただけますか?または、いくつかのドキュメントへのリンクを提供して、あなたがしたことを読んで理解します。
ザッピー

@zappyさん、マニュアルをman systemd.unit探して(またはインストールされていない場合はオンラインで検索して)、「ベンダー設定のオーバーライド」の章を探してください。
アレックス

ご意見ありがとうございます。上記の方法を選択するのは、サービスBがベンダー固有であり、そのサービスファイルを編集したくないためです。しかし、私の場合、サービスAとBの両方はベンダーから提供されていません。オーバーライドすると、システムが複雑になる可能性があります。他のオプションはありますか?
ザッピー

質問は2年前ですが、ドキュメントを確認しましたか?たぶん、このシナリオはその後カバーされました。私は急いでいたが、時間があればsystemdの公式メーリングリストを探してそこに尋ね、最終的には問題を開く
Alex

1

現時点では、systemdはこのシナリオをカバーしていません。サービスファイルだけではこの機能を実現できません。1つの可能性は、同じ名前のシェルスクリプトを介してsystemctlをハイジャックし、B.serviceが再起動またはリロードされようとしているかどうかを確認し、A.serviceで適切なアクションを実行し、必要に応じて更新しますrc.localも起動時に適切な状態になります。docker.serviceとnetworking.serviceでこの問題がありますが、常に一緒に再起動します。

systemctl restart docker.service networking.service

systemd自体がB.serviceを内部で操作する場合(他のサービスファイルなどを使用する場合)、明らかにこれは効果的ではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.