¿Cómo usar Ctrl + C para eliminar todos los procesos en segundo plano iniciados en un script Bash?


9

ArchLinux (Manjaro).

Estoy ejecutando un archivo bash. Ejecuta 2 procesos (comandos), utilizando &. Pero cuando presiono Ctrl+ Cpara detener el programa, un proceso muere y el otro continúa funcionando.

¿Cómo detengo ambos procesos? ¿O cómo escribo un nuevo script para eliminar estos dos procesos?

Respuestas:


13

Actualización: traprequiere eliminar el SIGprefijo con la condición, aunque algunos shells admiten incluirlo. Ver comentario a continuación.

El signo "&" ejecuta un comando en segundo plano en un nuevo proceso. Cuando finaliza su proceso padre (el comando que ejecuta el script bash en su caso), este proceso en segundo plano restablecerá su proceso padre a init (proceso con PID1), pero no morirá. Cuando presiona ctrl+c, está enviando una señal de interrupción al proceso en primer plano, y no afectará el proceso en segundo plano.

Para eliminar el proceso en segundo plano, debe usar el killcomando con el PIDdel proceso en segundo plano más reciente, que puede obtener $!.

Si desea utilizarlo ctrl+cpara eliminar tanto el script como el proceso en segundo plano, puede hacer esto:

trap 'kill $BGPID; exit' INT
sleep 1024 &    # background command
BGPID=$!
sleep 1024      # foreground command of the script

trapmodifica el controlador de trampa de SIGINT( traprequiere la eliminación del SIGprefijo, pero algunos shell pueden incluirlo) para que el script elimine el proceso $BGPIDantes de que salga.


Usando "trap 'kill $ BGPID; exit' SIGINT" me sale un "SC2039: en POSIX sh, el prefijo de los nombres de señal con 'SIG' no está definido". Creo que tienes que escribir trap 'kill $ BGPID; salida 'INT
Hettomei

@Hettomei Gracias por el aporte. Verifico dos veces la página del manual de trap y descubro que lo que sugirió es cierto: el estándar requiere que la condición (la señal de activación) no tenga el prefijo SIG, y admitir el prefijo SIG es una extensión. Se actualizó la respuesta original. pubs.opengroup.org/onlinepubs/009695399/utilities/trap.html
lyang

1

Los programas pueden ignorar la Ctrl+cseñal, ya que también pueden ignorar SIGTSTP

Puedes probar Ctrl+zen la mayoría de las conchas (no siempre, pero la mayoría de las veces)

Hay algunas señales que el proceso no puede ignorar: SIGKILL, SIGSTOP. Puedes enviar el comando kill. Para matar su proceso congelado, debe encontrar el ID de proceso (PID).
usa pgrep o ps y luego mátalo

 % kill -9 PID
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.