導致 systemd 錯誤「無法排隊 OnFailure= 作業:避免資源死鎖」的可能原因是什麼?

導致 systemd 錯誤「無法排隊 OnFailure= 作業:避免資源死鎖」的可能原因是什麼?

我的 systemdonFailure任務無法運行,我在system日誌中看到了這一點:

: 無法入隊 OnFailure= job: 避免資源死鎖

有哪些可能的原因可能會觸發此訊息並阻止我的OnFailure=任務運行?

我正在使用 systemd v229

答案1

這裡到底發生的是:您觸發 shutdown.target,systemd 使用作業模式「不可逆地替換」。該單元失敗是因為該目標與所有其他單元衝突,並觸發它們的停止。同時,你的單位肯定已經失敗了,所以它會觸發OnFailure=單位。現在,預設情況下,這也與 shutdown.target 衝突=,因此將觸發它的停止。但是,由於作業模式是不可逆替換的,因此它無法取消該作業並替換它,並且 systemd 認為這是衝突事務,因此它被中止。 manager_add_job 失敗,並且此匯流排錯誤會對應到 EDEADLK errno,因此您會看到 Resource deadlock escaped 字串。

答案2

這可以在旨在啟動系統、運行單一任務然後關閉的系統配置中觸發。包含失敗任務的 systemd 服務OnFailure=可能還包含:

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

為了完成關閉設備需要執行 poweroff 命令,存在死鎖。但要使 poweroff 指令完成運行,就需要停止設備。

同時,OnFailure=在發生死鎖時作業正在嘗試執行。

最終,該操作似乎poweroff很快就「贏得」了僵局,也搶先了OnFailure=任務的運作。

AWS 上的另一個解決方案是在執行個體上設定 CloudWatch 警報。如果執行個體上的最大 CPU 低於 1% CPU 持續 15 分鐘,警報將提供「採取操作:關閉」選項。

相關內容