67544


Ubuntu
20.04のsystemdを使っているのですが、Requires指定における「依存ユニットの起動に失敗したら本ユニットも失敗する」が機能しなくて悩んでます。

[code]

    # file:unitA.service
    [Unit]
    Description = Unit A
    Requires = unitB.service
    After = unitB.service
    
    [Service]
    Type = simple
    ExecStart = /usr/local/sbin/unitA
    
[/code]

[code]

    # file:unitB.service
    [Unit]
    Description = Unit B
    
    [Service]
    Type = simple
    ExecStart = /usr/local/sbin/unitB
    
[/code]

とし、unitB側の実行時に確実にエラー終了する(戻り値1を返すスクリプト)ようにしているのですが、

[code]

    $ sudo systemctl daemon-reload
    $ sudo systemctl stop unitA unitB # 一度両方を停止させておく
    $ sudo systemctl start unitA # Aだけ起動、本当ならBがコケるのでAも失敗してくれるはず…?
    $ 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'.
    
[/code]

と、Bは失敗してるけどA側が動いてしまってます。  
**Bが失敗してるときにAも起動できなくする** パラメーターは他にあったでしょうか?


CC BY-SA 4.0
2020-06-01T00:35:51.073
67175
2020-06-12T12:33:55.843
2020-06-01T02:32:29.213
19110
2236
question
linux ubuntu systemd
systemdのユニットにおけるrequiresが機能してないように見えます


Aが起動する理由は、Bの `Type=` が `simple` に設定されているため、 `unitB` が起動された瞬間にサービスの開始 (startup)
が成功したとみなされるからです。実際に起こっていることは以下のとおりです：

  1. `unitB` 正常にサービスが開始
  2. `unitA` Bが開始したために開始
  3. `unitB` サービス実行中に異常終了

あなたが書かれたような挙動を得るためには、サービスの開始が完了した時点を明示的に systemd に伝えるような `Type=` を `unitB`
に指定する必要があります。 `Type=` による挙動の違いは `systemd.service(5)` のmanページに詳しく書かれていますが、この場合
`forking` か `notify`
のどちらかになると思います。ただし、いずれを選んだにせよ、少しややこしい準備が必要になりますので、実際に使うサービスの実装に合わせて選ぶことになると思います。


CC BY-SA 4.0
2020-06-11T11:21:54.947
67544
2020-06-11T11:21:54.947
40595
67175
answer