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?
Respuestas:
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.
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 ellogind
programa 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
SIGTERM
o que tarda mucho en terminar una vez que lo ha vistoSIGTERM
. 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
fuente
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-units
te 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 laSIGKILL
señal. Realmente no queremos usarlo aSIGKILL
menos 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_NAME
que 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.
fuente
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
fuente
"Detener trabajos" es cuando
systemd
está 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ó ;)
fuente