导致 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 在 15 分钟内低于 1% CPU,则警报将具有“采取操作:关闭”选项。

相关内容