
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
起動が完了するまで遅延されます。BeforeAfter=
=の逆です。
私が強調表示します。これは、両方のユニットが起動されている場合にのみ効果があります。どちらか一方を無効にすると、効果はありません。
あなたが実際に何を望んでいるのかは、あまり明確ではありません。
おそらくより良い選択肢は次のとおりです:
に似ていますが、より強い要件依存関係を宣言します。このタイプの依存関係は、ユニット ファイルに付随するディレクトリ
Wants=
へのシンボリック リンクを追加することによっても構成できます。.requires/
このユニットがアクティブ化されると、リストされているユニットもアクティブ化されます。他のユニットの 1 つがアクティブ化に失敗し、
After=
失敗したユニットに順序の依存関係が設定されている場合、このユニットは起動されません。また、 の指定の有無にかかわらずAfter=
、他のユニットの 1 つが明示的に停止されると、このユニットは停止されます。
と同様の依存関係を設定します
Requires=
が、ユニットの停止と再起動に限定されます。systemd がここにリストされているユニットを停止または再起動すると、そのアクションがこのユニットに伝播されます。これは一方向の依存関係であることに注意してください。このユニットへの変更は、リストされているユニットには影響しません。