前提・実現したいこと
Requiresの依存関係と成否があやふやになってます。はっきりさせたいので質問させてください。
各種資料を見ると、依存関係としてのRequires/Wantsについて
- Requiresは依存ユニットが失敗すると起動できない
- Wantsは依存ユニットが失敗しても起動する
という記述を見るのですが、Requires先で指定したユニットを敢えてエラー終了するようにしても起動しているように見えてしまいます。
下記のようにunitAとunitBが存在し、unitAがB側に依存という状況で、「unitBの起動に失敗したときにA側を起動させない」ための設定を教えていただければと思います…
現実例としては、 MariaDBが起動できない状況ならWordpress専用Apache(+PHP)の起動をキャンセルする でしょうか(中途半端に起動されるよりは失敗していた方が良い
派)。
発生している問題・エラーメッセージ
sl% sudo systemctl stop unitA unitB sl% sudo systemctl start unitA sl% sudo tail /var/log/syslog Jun 1 05:56:00 sl systemd[1]: Started Unit B. Jun 1 05:56:00 sl systemd[1]: Started Unit A. Jun 1 05:56:00 sl systemd[1]: unitB.service: Main process exited, code=exited, status=1/FAILURE Jun 1 05:56:00 sl systemd[1]: unitB.service: Failed with result 'exit-code'.
と、一度両方のユニットを止めた後A側を起動すると、Bはエラー停止してくれてますが、Aは起動を継続しています。
各ユニットの状態を取得すると、
sl% sudo systemctl status unitA unitB --no-pager ● unitA.service - Unit A Loaded: loaded (/usr/local/lib/systemd/system/unitA.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2020-06-01 05:56:00 JST; 1min 35s ago Main PID: 2657 (unitA) Tasks: 1 (limit: 1157) Memory: 632.0K CGroup: /system.slice/unitA.service └─2657 /bin/bash /usr/local/sbin/unitA 6月 01 05:56:00 sl systemd[1]: Started Unit A. ● unitB.service - Unit B Loaded: loaded (/usr/local/lib/systemd/system/unitB.service; enabled; vendor preset: enabled) Active: failed (Result: exit-code) since Mon 2020-06-01 05:56:00 JST; 1min 35s ago Process: 2656 ExecStart=/usr/local/sbin/unitB (code=exited, status=1/FAILURE) Main PID: 2656 (code=exited, status=1/FAILURE) 6月 01 05:56:00 sl systemd[1]: Started Unit B. 6月 01 05:56:00 sl systemd[1]: unitB.service: Main process exited, code=exited, status=1/FAILURE 6月 01 05:56:00 sl systemd[1]: unitB.service: Failed with result 'exit-code'.
と、やはりRequiresの意図と食い違っているように見えます。どこかで私が認識ミスを犯しているのでしょうか?
該当のソースコード
unitA.serviceとunitB.serviceの例です。
[Unit] Description = Unit A Requires = unitB.service After = unitB.service [Service] Type = simple ExecStart = /usr/local/sbin/unitA
[Unit] Description = Unit B [Service] Type = simple ExecStart = /usr/local/sbin/unitB
それぞれで起動するもの(unitA,unitB)は単純に無限ループするスクリプトにしていますが、B側は強制的にエラー終了扱いになるように手を入れてます。
#!/bin/bash # 注意: このスクリプトはひたすらにCPUを無駄遣いします # 強制エラー終了(Bのみ) exit 1 while true; do echo "" > /dev/null done
Aについてはexit行が無いだけです。
補足情報(FW/ツールのバージョンなど)
Ubuntu 20.04LTS上のsystemd環境です。
sl% dpkg -l systemd 要望=(U)不明/(I)インストール/(R)削除/(P)完全削除/(H)保持 | 状態=(N)無/(I)インストール済/(C)設定/(U)展開/(F)設定失敗/(H)半インストール/(W)トリガ待ち/(T)トリガ保留 |/ エラー?=(空欄)無/(R)要再インストール (状態,エラーの大文字=異常) ||/ 名前 バージョン アーキテクチ 説明 +++-==============-==============-============-================================= ii systemd 245.4-4ubuntu3 amd64 system and service manager
回答1件
あなたの回答
tips
プレビュー