FeaturedNOTICIAS

SIGINT, SIGTERM y SIGKILL: CloudSavvy IT


símbolo de peligro
Shutterstock / SkillUp

Las interrupciones de software en los sistemas Linux y Unix se realizan mediante señales. Hay muchas señales de Linux diferentes, pero algunas se destacan y es importante comprenderlas y conocerlas: SIGINT, SIGTERM y SIGKILL. Así es como funcionan.

Que es un Señal de Linux?

Todos sabemos que una luz roja significa que debemos dejar de caminar o conducir. De manera similar, en los sistemas Linux y Unix, puede pasar una señal a un programa o servicio en ejecución para que interactúe con él. Por ejemplo, puede enviar una señal de luz roja a un programa simplemente emitiendo un SIGTERM señal.

Al igual que con un semáforo en rojo, las personas pueden optar por seguir caminando o conduciendo cuando el semáforo está en rojo. Si bien puede que no sea una idea segura para todos los involucrados, SIGTERM la señal enviada a un proceso hará exactamente eso; el proceso / programa puede optar por ignorar esta señal.

Todas las señales básicas de Linux tienen un número (1-30 +). Después de un tiempo, un usuario de Linux experimentado generalmente conocerá uno o más de estos. Por ejemplo, el SIGTERM la señal corresponde al número 15 y la señal 9 (SIGKILL) es probablemente el más conocido, ya que le permite terminar un proceso a la fuerza, a diferencia del nuestro. SIGTERM ejemplo de luz roja.

htop muestra posibles señales de programa

Aquí vemos la pantalla principal de htop (puede instalar esta práctica utilidad escribiendo sudo apt install htop en Ubuntu / Mint o sudo yum install htop en RedHat / Centos / Fedora) con un número de terminación y otras señales (más abajo en la lista; hay 37 en total) que se pueden enviar a un proceso previamente seleccionado a la derecha. Puede seleccionar un proceso presionando el cursor arriba / abajo y luego enviar una señal usando F9.

SIGKILL & SIGTERM

Si bien el nombre puede sonar un poco siniestro, la jerga común de Linux para la terminación de procesos es que «matas» un proceso. En general, solo queremos finalizar un proceso con un -9 (SIGKILL) informe si este proceso / programa está pendiente. Tenga en cuenta que siempre que hablamos de proceso o programa, las palabras se pueden intercambiar a voluntad. Básicamente, un proceso es cualquier programa (o servicio) en ejecución al que se le ha asignado un archivo PID (un identificador de proceso).

Veamos un ejemplo de finalización de un proceso en segundo plano en ejecución utilizando un SIGKILL señal al proceso en ejecución. Tenga en cuenta que, como se explicó SIGKILL es bastante destructivo y terminará el proceso independientemente de lo que le gustaría hacer con la señal. El proceso puede capturar y redirigir varias señales, mientras que otras no.

Envíe SIGKILL a un proceso de suspensión que se ejecuta en segundo plano

Aquí empezamos sleep 1800 en el fondo (usando & al final del comando), que se inició como el primero ([1]) proceso en segundo plano con PID 574660. Luego terminamos ese proceso en segundo plano usando kill -9 574660, dónde está el -9 representa SIGKILL.

Incluso si el proceso finaliza inmediatamente, no vemos el mensaje de finalización (proceso en segundo plano 1 asesinado, es decir, [1]+ Killed) ya que el símbolo del sistema regresa antes de que se muestre el mensaje, es decir, devolver la línea de comando fue más rápido que finalizar el proceso o similar.

Comprobamos la lista de procesos buscando el PID ps -ef | grep 574660. Aunque hay salida, la salida que se muestra es solo para nuestra ejecución grep mando; la sleep el proceso ya ha finalizado.

Evaluamos lo mismo con SIGTERM, es decir kill -15 ${PID} Dónde está ${PID} es el proceso que queremos terminar.

Envíe SIGTERM a un proceso de suspensión que se ejecuta en segundo plano

Tuvimos que presionar Enter para activar / mostrar el mensaje de terminación (como se explicó anteriormente). Podemos ver que el programa ha terminado con éxito nuevamente. Sin embargo, esta vez, aunque invisible para este ejemplo en particular (¡siga leyendo!), Internamente dentro del archivo sleep código del programa, las cosas fueron un poco diferentes.

En este caso (usando -15 es decir SIGTERM para finalizar el proceso), el sleep El proceso fue notificado y tuvo la oportunidad de gestionar la señal internamente. Posteriormente puede responder cerrándose automáticamente, ignorando la señal o mediante cualquier otra acción desarrollada en el código. También podemos probar que esto es cierto comprobando la señal de salida y / o la salida:

La diferencia en los códigos de salida y salida según la señal enviada

Aqui comenzamos el proceso sleep 2000 dos veces, luego usó otra sesión de shell / terminal para terminar el programa. La primera vez que usamos kill -9 y la segunda vez que lo usamos kill -15 para detener el archivo sleep Procesos.

Inmediatamente notamos cómo regresa la salida. Killed en el primero (kill -9 acción) instancia. Para el segundo intento (usando kill -15), vemos la salida Terminated en vez de; el programa terminó solo. Después de las respectivas terminaciones, también verificamos las señales de salida y descubrimos que los códigos de salida eran diferentes.

¿Porque es esto importante? Considere programas más grandes; en este caso, solo estábamos terminando uno simple sleep mando. No hubo datos administrados, tráfico enviado hacia adelante / hacia atrás, etc. Pero, ¿y si enviamos un archivo? kill -9 comando a nuestro servidor de base de datos (esto generalmente requeriría privilegios de nivel de raíz / sudo)?

Activaría la base de datos para entrar en el modo de recuperación de fallos en el próximo arranque porque, hasta donde sabe el software de la base de datos, todo lo que sucedió fue «estaba allí» seguido de «nada». En otras palabras, se estrelló. Si en cambio hubiéramos emitido un archivo kill -15 comando, el software de la base de datos podría haber realizado un apagado controlado, por ejemplo, primero bloqueando la conexión de nuevos usuarios, luego desconectando / terminando a los usuarios existentes, luego terminando la escritura de datos, etc. antes de terminar definitivamente.

Envío de señales de Linux con secuencias de teclado

¿Sabías que cada vez que enviaste un CTRL+c pulsaciones de teclas para un programa que se ejecuta, por ejemplo, en una terminal, que en su lugar SIGINT es enviado? Demos un paso atrás a nuestra confianza sleep comando y prueba esto:

Un proceso de suspensión interrumpido por una señal SIGINT enviada a través de una secuencia de teclas CTRL + C.

Aquí empezamos sleep nuevamente, luego presione la combinación de teclas CTRL+c. El programa ha terminado, o mejor dicho fue interrumpido desde el SIGINT señal enviada. Pedimos el código de salida y confirmamos que una vez más el código de salida es diferente a las señales anteriores.

Tenga en cuenta que este código de salida, para dormir, siempre coincidirá con la señal que se envía, aunque es posible que no se cubran todas las señales. En otras palabras, al usar CTRL+c en la línea de comando, el código de salida siempre será 130, 137 cuando asesinado con kill -9, es 143 Cuándo kill -15 Fue utilizado.

Puede probar los códigos de salida de los comandos consultando el archivo $? variable, que contiene el código de salida del comando anterior (siempre que no se haya iniciado un nuevo comando). Conocer el código de salida de un comando dado en una situación particular, y / o como resultado de una señal particular enviada a ese comando, ayuda cuando los scripts para soluciones que manejan otros procesos, etc. (Que es el caso de muchos scripts de shell, particularmente en la gestión de servidores o entornos automatizados).

Otra secuencia de teclado de uso frecuente es CTRL+z. Esto enviará un archivo SIGTSTP señal, una suspend señal que suspende inmediatamente un proceso hasta (por ejemplo) 'fg' El comando se emite para el mismo proceso que lo traerá de vuelta al primer plano.

Para obtener más información sobre la gestión de procesos, consulte Bash Process Termination Hacks.

Terminando

En este artículo, hemos analizado las señales de Linux más importantes y cómo podemos usarlas prácticamente en un entorno Linux o Unix. Conocer las señales básicas de Linux ayuda con el uso diario y la administración de Linux, por ejemplo, cuando un proceso está pendiente y debe terminarse con kill -9. En un artículo futuro, podríamos considerar adquirir una señal usando la extensión trap comando desde dentro de un script Bash, lo que le permite definir un procedimiento personalizado para ejecutar cuando se emite dicha señal.

Si disfrutó leyendo este artículo, consulte nuestra serie Bash Automation comenzando con Bash Automation & Scripting Basics. En el tercer artículo de esa serie, también analizamos la gestión de procesos en segundo plano, mencionada anteriormente en este artículo.

TE INTERESA>>  La Juve, a punto de fichar a Locatelli y Kaio Jorge

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba