after= オプションが systemd サービス ファイルで機能しない

after= オプションが systemd サービス ファイルで機能しない

first.sh と second.sh という 2 つのシェル スクリプトがあります。first.sh と second.sh の内容は次のとおりです。

    >>first.sh
    #!/bin/bash
    while true
    do 
        echo The current time is $(date)
        sleep(1)
    done



    >>second.sh
    #!/bin/bash
    while true
    do 
        echo The current time from second script is $(date)
        sleep(1)
    done

同様に、first.service の内容は次のとおりです。

[Unit]
Description=first service
After=second.service
[Service]
ExecStart=/home/abanstola/first.sh

second.service の内容は次のとおりです。

[Unit]
Description=Second service
[Service]
ExecStart=/home/abanstola/second.sh

first.service コードの に注意してくださいAfter=second.service。ドキュメントによると、最初のサービスは 2 番目のサービスが開始するまで実行されるべきではありません。しかし、2 番目のサービスを無効にしたり停止したりしても、最初のサービスは問題なく実行されます。ここで何が間違っているのでしょうか?

答え1

ドキュメントを誤読しています。引用:

ユニットfoo.serviceに設定が含まれている場合Before=bar.service 両ユニットとも始動中bar.serviceの起動は、foo.service起動が完了するまで遅延されます。Before After==の逆です。

私が強調表示します。これは、両方のユニットが起動されている場合にのみ効果があります。どちらか一方を無効にすると、効果はありません。

あなたが実際に何を望んでいるのかは、あまり明確ではありません。

おそらくより良い選択肢は次のとおりです:

Requires=

に似ていますが、より強い要件依存関係を宣言します。このタイプの依存関係は、ユニット ファイルに付随するディレクトリWants=へのシンボリック リンクを追加することによっても構成できます。.requires/

このユニットがアクティブ化されると、リストされているユニットもアクティブ化されます。他のユニットの 1 つがアクティブ化に失敗し、After=失敗したユニットに順序の依存関係が設定されている場合、このユニットは起動されません。また、 の指定の有無にかかわらずAfter=、他のユニットの 1 つが明示的に停止されると、このユニットは停止されます。

PartOf=

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

関連情報