¿Qué es exactamente "un trabajo de detención", como en "Se está ejecutando un trabajo de detención ..."?

29

Después de emitir un comando de apagado, a veces uno recibe un mensaje de estado como este:

A stop job is running for Session 1 of user xy

y luego el sistema se cuelga por un tiempo, o para siempre dependiendo de ???

Entonces, ¿qué es exactamente "un trabajo de parada"?

Además, ¿por qué a veces estima el tiempo que llevará, con bastante precisión, y otras veces puede funcionar para siempre?

Vista elíptica
fuente
1
Tal vez debería ser detenido trabajo? La sesión ha detenido trabajos, que en realidad no se están ejecutando, por lo que no tienen la oportunidad de responder a las señales de finalización.
Kaz

Respuestas:

27

systemd opera internamente en términos de una cola de "trabajos". Cada trabajo (simplificando un poco) es una acción a tomar: detener, verificar, iniciar o reiniciar una unidad en particular .

Cuando (por ejemplo) le indica a systemd que inicie una unidad de servicio , elabora una lista de trabajos de detención e inicio para cualquier unidad (unidades de servicio, unidades de montaje, unidades de dispositivo, etc.) necesarias para lograr ese objetivo, de acuerdo con los requisitos y dependencias de la unidad, los ordena, de acuerdo con las relaciones de orden de la unidad, funciona y (si es posible) corrige cualquier contradicción, y (si ese paso final es exitoso) los coloca en la cola.

Luego intenta realizar los "trabajos" en cola.

Se está ejecutando un trabajo de detención para la sesión 1 del usuario xy

El nombre para mostrar de la unidad aquí es Session 1 of user xy. Esta será (desde el nombre para mostrar) una unidad de sesión , no una unidad de servicio . Esta es la abstracción de sesión de inicio de sesión de espacio de usuario que mantiene el logindprograma systemd y sus complementos PAM. Es (en esencia y en teoría) una agrupación de todos los procesos que ese usuario está ejecutando como una "sesión de inicio de sesión" en alguna parte.

El trabajo que se ha puesto en cola contra él es stop. Y es probable que tomar mucho tiempo porque la gente systemd han fusionado erróneamente sesión de colgar con la sesión de cierre . Rompen el primero para que el último funcione, y en respuesta algunas personas alteran el sistema para romper el último y hacer que el primero funcione. La gente del sistema realmente debería reconocer que son dos cosas diferentes.

En su sesión de inicio de sesión, tiene algo que ignora SIGTERMo que tarda mucho en terminar una vez que lo ha visto SIGTERM. Irónicamente, el primero es el comportamiento de larga data de algunos proyectiles de control de trabajo. La forma correcta de terminar los líderes de sesión de inicio de sesión cuando son estos shells de control de trabajo en particular es decirles que la sesión se ha colgado , con lo cual terminan todos sus trabajos (un tipo diferente de trabajo para el trabajo interno del sistema) y luego terminar ellos mismos.

Lo que está sucediendo realmente es que systemd está a la espera de la unidad parada de tiempo de espera hasta que se recurre a SIGKILL. Este tiempo de espera es configurable por unidad, por supuesto, y se puede configurar para que nunca se agote el tiempo de espera. Por eso, uno puede ver diferentes comportamientos.

Otras lecturas

JdeBP
fuente
1
Según esta respuesta, unix.stackexchange.com/a/297318/224025 podemos cambiar esta vez. ¿Sería seguro (o haría algún daño) si lo cambio a cero segundos?
GypsyCosmonaut
1
En realidad, el párrafo final de esta respuesta y el manual del usuario al que le indico que siga leyendo ya le informan sobre cómo cambiar el tiempo de espera. Una pregunta sobre qué significa un tiempo de espera de 0s y si es seguro emplearla debe hacerse como una pregunta por Cómo preguntar porque es una pregunta de seguimiento a una pregunta de qué es un "trabajo de parada" y por qué varían los tiempos de espera. Sospecho que podría ser bueno.
JdeBP
2

Estos mensajes son de systemd, que es un sistema init que inicia y detiene los trabajos. Los trabajos pueden ser demonios, pero también pueden realizar pequeñas tareas, como montar y desmontar discos, eliminar / tmp, o guardar y restaurar el brillo de la pantalla en el arranque. systemctl list-unitste da la idea Systemd usa "unidad" y "trabajo" para significar lo mismo.

Cuando se detiene un trabajo, como con systemctl stop ..., entonces una pregunta es cuánto tiempo esperar para que el trabajo se complete antes de declarar el fracaso y matar los procesos del trabajo con la SIGKILLseñal. Realmente no queremos usarlo a SIGKILLmenos que tengamos que hacerlo, ya que no da la oportunidad de que el proceso salga limpiamente. Para algunos procesos, unos pocos segundos pueden ser tiempo suficiente para declarar la falla, para otros procesos, como una base de datos, puede haber una gran cantidad de E / S de red y disco para que el trabajo se detenga limpiamente y, por lo tanto, podríamos darles a esas unidades varios minutos para que se apaguen limpiamente .

Lo que está viendo al apagar es el equivalente de lo systemctl stop $UNIT_NAMEque está tardando en ejecutarse. Hay un contador que muestra los segundos transcurridos y el tiempo de espera máximo antes de que se emita SIGKILL y el apagado continúe independientemente.

A menos que haya buenas razones para esperar un retraso prolongado, esto generalmente indica algún tipo de mal funcionamiento. Eso puede variar desde un servidor DHCP que no responde a una versión y, por lo tanto, la acción de liberación necesita un tiempo de espera, o algún error que hace que un demonio nunca salga.

vk5tu
fuente
"Systemd usa" unidad "y" trabajo "para significar lo mismo". No creo que sea cierto: en términos generales, un "trabajo" es una solicitud para hacer algo a una "unidad". Ver la respuesta de @ JdeBP para más detalles.
Thomas
1

Algún servicio está atascado y systemd está esperando que salga. Systemd probablemente no esté calculando con precisión el tiempo que tomará, el tiempo (generalmente 90 segundos) es cuánto tiempo esperará systemd antes de que se le acabe la paciencia. Ver esta publicación:

Se está ejecutando un trabajo de detención para la sesión c2 del usuario

Johan Myréen
fuente
66
¿Cómo puedo averiguar qué servicio se bloquea?
naitsirch
0

"Detener trabajos" es cuando systemdestá esperando que se detenga un "trabajo" específico, por ejemplo, algún proceso que está esperando completar antes de continuar. Si ve un mensaje de advertencia de que "se está ejecutando un trabajo de detención ..." (etc.) técnicamente significa que hay algo pendiente en la cola de trabajos.

Sin embargo, antes de explorar toda la cola de trabajos del sistema, tenga en cuenta que a veces estos mensajes de advertencia son un resultado indirecto de factores ambientales (de hecho, el mensaje incluso se menciona en su repositorio de GitHub como un posible error).

Por ejemplo: recibíamos mensajes relacionados con "detener el trabajo" y no podíamos entender por qué ... resulta que el disco estaba casi sin espacio y comenzó a hacer que el sistema operativo se comportara de manera extraña.

Actualizar el servidor a un disco más grande y reiniciarlo lo reparó ;)

jessuppi
fuente