我的 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 分鐘,警報將提供「採取操作:關閉」選項。