¿Cuáles son las posibles causas del error de systemd "Error al poner en cola OnFailure= trabajo: se evitó el bloqueo de recursos"?

¿Cuáles son las posibles causas del error de systemd "Error al poner en cola OnFailure= trabajo: se evitó el bloqueo de recursos"?

Mis onFailuretareas de systemd no se pudieron ejecutar y veo esto en el systemdiario:

: No se pudo poner en cola OnFailure= trabajo: se evitó el bloqueo de recursos

¿Cuáles son las posibles causas que podrían desencadenar este mensaje e impedir que OnFailure=se ejecute mi tarea?

Estoy usando systemd v229

Respuesta1

Lo que sucede exactamente aquí es: activas Shutdown.target, systemd usa el modo de trabajo 'reemplazar irreversiblemente' para ello. La unidad falla porque este objetivo entra en conflicto con todas las demás unidades y provoca una parada para ellas. Mientras tanto, su unidad debe haber fallado, por lo que activa OnFailure= unidad. Ahora, de forma predeterminada, esto también entra en conflicto = con Shutdown.target, por lo que provocará una detención. Pero, dado que el modo de trabajo se reemplazó de manera irreversible, no puede cancelar ese trabajo y reemplazarlo, y systemd considera que se trata de una transacción conflictiva, por lo que se cancela. manager_add_job falla y este error de bus se asigna a EDEADLK errno, por lo que verá la cadena Bloqueo de recursos evitado.

Respuesta2

Esto puede desencadenarse en una configuración del sistema diseñada para iniciar un sistema, ejecutar una sola tarea y luego apagarlo. El servicio systemd que también contiene la OnFailure=tarea fallida también podría contener:

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

Hay un punto muerto en el sentido de que para terminar de apagar la unidad es necesario ejecutar los comandos de apagado. Pero para que el comando de apagado termine de ejecutarse, es necesario detener la unidad.

Mientras tanto, el OnFailure=trabajo intenta ejecutarse mientras se produce este punto muerto.

En última instancia, parece que la poweroffacción pronto "gana" el punto muerto, lo que también impide OnFailure=que se ejecute la tarea.

Una solución alternativa en AWS es configurar una alarma de CloudWatch en la instancia. La alarma tendrá la opción "Tomar acción: Apagar" si la CPU máxima en la instancia es inferior al 1 % de CPU durante 15 minutos.

información relacionada