GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cuándo envía el sistema un SIGTERM a un proceso?

Lo publicaré como respuesta para que haya algún tipo de resolución si este resulta ser el problema.

Un estado de salida de 0 significa una salida normal de un programa exitoso. Un programa que sale puede elegir cualquier número entero entre 0 y 255 como su estado de salida. Convencionalmente, los programas usan valores pequeños. El shell utiliza los valores 126 y superiores para informar condiciones especiales, por lo que es mejor evitarlos.

En el nivel de la API de C, los programas informan un estado¹ de 16 bits que codifica tanto el estado de salida del programa como la señal que lo eliminó, si corresponde.

En el shell, el estado de salida de un comando (guardado en $? ) combina el estado de salida real del programa y el valor de la señal:si una señal elimina un programa, $? se establece en un valor superior a 128 (con la mayoría de los shells, este valor es 128 más el número de señal; ATT ksh usa 256 + número de señal y yash usa 384 + número de señal, lo que evita la ambigüedad, pero los otros shells no han seguido traje).

En particular, si $? es 0, su programa salió normalmente.

Tenga en cuenta que esto incluye el caso de un proceso que recibe SIGTERM, pero tiene un controlador de señal para él y finalmente sale normalmente (quizás como una consecuencia indirecta de la señal SIGTERM, quizás no).

Para responder a la pregunta de su título, el sistema nunca envía automáticamente SIGTERM. Hay algunas señales que se envían automáticamente como SIGHUP cuando un terminal se desconecta, SIGSEGV/SIGBUS/SIGILL cuando un proceso hace cosas que no debería estar haciendo, SIGPIPE cuando escribe en una tubería/socket roto, etc. Y hay algunas señales que se envían debido a la pulsación de una tecla en un terminal, principalmente SIGINT para Ctrl +C , SIGQUIT para Ctrl +\ y SIGTSTP para Ctrl +Z , pero SIGTERM no es uno de esos. Si un proceso recibe SIGTERM, algún otro proceso envió esa señal.

¹ en ​​términos generales


SIGTERM es la señal que normalmente se usa para terminar administrativamente un proceso.

Esa no es una señal que enviaría el kernel, pero es la señal que normalmente enviaría un proceso para terminar (con gracia) otro proceso.

Esa es la señal que envía por defecto el kill , pkill , killall ... comandos.

Esa es la señal que se envía a los demonios para detenerlos (como en un service some-service stop ), o enviado por init antes del apagado (seguido de SIGKILL para aquellos procesos que no han logrado terminar a tiempo con SIGTERM).

Tenga en cuenta que SIGTERM es no la señal que se envía a ^C . La señal enviada en ^C es SIGINT.


Linux
  1. ¿Nuevo proceso principal cuando muere el proceso principal?

  2. ¿Cómo realiza Unix un seguimiento del directorio de trabajo de un usuario al navegar por el sistema de archivos?

  3. ¿Qué significa en la salida de Ps?

  4. UNIX/Linux:3 Maneras de Enviar Señal a Procesos

  5. ¿Cuál es la mejor manera de enviar una señal a todos los miembros de un grupo de procesos?

SIGTERM vs SIGKILL:¿Cuál es la diferencia?

Cómo enviar procesos a segundo plano en Linux

¿Qué es la tabla de procesos de Linux? ¿En qué consiste?

¿Cómo puedo eliminar un usuario en Linux cuando el sistema dice que actualmente se usa en un proceso?

¿Por qué popen() invoca un shell para ejecutar un proceso?

¿Qué sucede al enviar SIGKILL a un Proceso Zombie en Linux?