45 votos

¿Cómo matar un script que se ejecuta en el terminal, sin cerrar el terminal (Ctrl + C no funciona)?

He escrito un bash script que llama a varios otros programas y ejecuta un montón de comandos. Ejecuto este script desde la terminal. Ahora quiero matar el script.

Pulsando Ctrl + C a veces no sirve, creo que porque a veces el script está ejecutando otro programa, y por alguna razón la señal de kill no funciona.

Sin embargo, si cierro la ventana de la terminal, mata el script.

¿Hay algo que pueda hacer (una combinación de teclado), que sea análoga a cerrar la ventana del terminal, sin cerrar realmente la ventana del terminal (no quiero perder el historial de comandos, el directorio actual, el historial de salida, etc.)?

43voto

muru Puntos 43315

Tienes pocas opciones. Una es detener el script ( CtrlZ ), obtener el PID del script y enviar SIGKILL al grupo de procesos.

Cuando se ejecuta un comando en un Shell, el proceso que inicia y todos sus hijos forman parte del mismo grupo de procesos (en este caso, el grupo de procesos en primer plano). Para enviar una señal a todos los procesos de este grupo, se envía al líder del proceso. Para el kill el líder del proceso se denota así:

kill -PID

Dónde PID es el ID del proceso del script.

Ejemplo:

Considere un script test.sh que lanza algunos procesos. Digamos que lo ejecuta en un Shell:

$ ./test.sh

En otra terminal,

$ pgrep test.sh
17802
$ pstree -ps `!!`
pstree -ps `pgrep test.sh`
init(1)sshd(1211)sshd(17312)sshd(17372)zsh(17788)test.sh(17802)dd(17804)
                                                                               sleep(17805)
                                                                               yes(17803)

En este caso, para enviar una señal al grupo de procesos creado por test.sh lo harías:

kill -INT -17802

-INT se utiliza para enviar SIGINT por lo que este comando es el equivalente a pulsar CtrlC en el terminal. Para enviar SIGKILL :

kill -KILL -17802

Sólo necesitas detener el script si no puedes abrir otra terminal. Si puede, utilice pgrep para encontrar el PID.

Uno de los comandos que lanza el script puede estar atrapando SIGINT , que es probablemente la razón por la que CtrlC es ineficaz. Sin embargo, SIGKILL no puede ser atrapado, y suele ser un último recurso opción. Puede que quieras probar SIGTERM ( -TERM ) antes de ir a matar. Tampoco SIGKILL o SIGTERM puede configurarse como un atajo de teclado el camino SIGINT es.

Todo esto es discutible si tu script no contiene una línea shebang. De esta respuesta SO :

Normalmente el Shell padre adivina que el ShellscriptShell está escrito para el mismo Shell (los shells mínimos tipo Bourne ejecutan el ShellscriptShell con /bin/sh, bash lo ejecuta como un subproceso bash)...

Debido a esto, cuando se ejecute el script, no encontrará un proceso con el nombre de script (o un proceso con el nombre del script en la línea de comandos) y pgrep fallará.

Utiliza siempre una línea de shebang.

6voto

Harris Puntos 1521

Si conoces los procesos que están asociados al script puedes encontrar su PID usando

 ps -A

y luego usar el número PID para matar los procesos correspondientes usando

 kill -9 PID_Number

1voto

user315115 Puntos 21

Como dijo Harris, podrías correr Kill -9 PID_Number pero también puede instalar el paquete conocido como htop para tener un navegador de procesos interactivo que hace que encontrar procesos específicos sea mucho más fácil. htop también soporta matar procesos.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: