systemd エラー「OnFailure= ジョブのエンキューに失敗しました: リソースのデッドロックが回避されました」の考えられる原因は何ですか?

systemd エラー「OnFailure= ジョブのエンキューに失敗しました: リソースのデッドロックが回避されました」の考えられる原因は何ですか?

systemdonFailureタスクの実行に失敗し、systemジャーナルに次のように表示されます:

: キューへの登録に失敗しました OnFailure= ジョブ: リソースのデッドロックを回避しました

OnFailure=このメッセージが表示され、タスクの実行が妨げられる原因として考えられるものは何ですか?

私はsystemd v229を使用しています

答え1

ここで正確に何が起きるかは、次のとおりです。shutdown.target をトリガーすると、systemd はジョブ モード 'replace-irreversibly' を使用します。このターゲットは他のすべてのユニットと競合するため、ユニットは失敗し、それらの停止をトリガーします。その間に、ユニットが失敗したはずなので、OnFailure= ユニットをトリガーします。デフォルトでは、これも Conflicts= で、shutdown.target と競合するため、停止をトリガーします。ただし、ジョブ モードが replace-irreversibly であるため、そのジョブをキャンセルして置き換えることはできず、systemd はこれを競合するトランザクションと見なして中止します。manager_add_job は失敗し、このバス エラーは EDEADLK errno にマップされるため、Resource deadlock Avoided 文字列が表示されます。

答え2

このケースは、システムを起動し、単一のタスクを実行してからシャットダウンするように設計されたシステム構成で発生する可能性があります。失敗したタスクも含まれる systemd サービスには、次のOnFailure=ものも含まれる可能性があります。

ExecStopPost=/usr/bin/sudo /sbin/poweroff

ユニットのシャットダウンを完了するには、poweroff コマンドを実行する必要があるため、デッドロックが発生します。ただし、poweroff コマンドの実行を完了するには、ユニットを停止する必要があります。

一方、OnFailure=このデッドロックが発生している間にジョブは実行されようとしています。

poweroff最終的には、アクションがすぐにデッドロックを「克服」し、タスクの実行を阻止するようですOnFailure=

AWS での代替ソリューションは、インスタンスに CloudWatch アラームを設定することです。インスタンスの最大 CPU が 15 分間 1% 未満の場合は、アラームに「アクションを実行: シャットダウン」オプションが表示されます。

関連情報