es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo capturar SIGINT dentro de una subshell de Bash

Si ejecuto un comando, como grep, en la línea de comandos y presiono ^C, el comando se termina correctamente (creo que con SIGINT). Y si ejecuto grep en segundo plano y luego ejecuto kill SIGINT en su PID, también se termina. Pero si estoy dentro de un script y ejecuto grep en segundo plano desde el script, obtengo su PID y luego uso ‘kill -s SIGINT $PID’, grep no se termina. ¿Por qué? Si uso SIGTERM en lugar de SIGINT, la kill sí funciona.

#!/bin/bash
grep -rqa shazam /usr &
PID=$!
kill -s SIGINT $PID

Incluso si pongo grep en un subproceso, precedido por un controlador de SIGINT (en el subproceso), y golpeo el subproceso con SIGINT, el controlador no se activa.

#!/bin/bash
( trap ‘echo “capturado señal”‘ SIGINT; grep -rqa shazam /usr ) &
PID=$!
kill -s SIGINT $PID

El controlador de trampa se activa si uso SIGTERM en lugar de SIGINT, pero no interrumpe grep. Si agrego ‘/bin/kill -s SIGTERM 0’ en el controlador de trampas, hay una indicación de que el proceso grep se termina, pero grep ya ha completado su trabajo para entonces. Me doy cuenta de que Bash puede tener diferentes comportamientos predeterminados para las diferentes señales, pero no entiendo por qué mi llamada a kill SIGINT es diferente a un ^C, por qué la llamada de trampa funciona para SIGTERM pero no para SIGINT, ni por qué SIGTERM no se maneja inmediatamente en el subproceso.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema aquí está relacionado con cómo la terminal bash maneja las señales, específicamente SIGINT y SIGTERM. Al ejecutar un comando como grep en primer plano, al pulsar ^C se envía una señal SIGINT al proceso, lo que provoca su terminación. De manera similar, al ejecutar el comando en segundo plano y enviar una señal SIGINT con kill, también se produce la terminación.

    Sin embargo, al ejecutar el mismo comando en un script y enviar una señal SIGINT con kill, el proceso no se termina. Esto podría ser porque la terminal bash intercepta la señal y la maneja de manera diferente que cuando se envía directamente al proceso.

    Usar el comando trap para capturar la señal SIGINT y ejecutar un comando (como kill -s SIGTERM 0) podría solucionar este problema, pero es posible que no interrumpa el proceso en ejecución de inmediato.

    La razón por la cual la llamada trap funciona para SIGTERM pero no para SIGINT podría deberse a diferencias en cómo la terminal bash maneja las señales. SIGINT puede ser manejada de manera diferente, ya que comúnmente se utiliza para interrumpir la entrada del usuario, mientras que SIGTERM se utiliza con más frecuencia para apagar el sistema.

    En general, parece que el comportamiento de las señales en una terminal bash puede ser complejo y puede requerir algo de experimentación y comprensión de la señal y el proceso específicos con los que se está trabajando.

Comments are closed.