He escrito un script bash que llama a varios otros programas y ejecuta un montón de comandos. Ejecuto este script desde la terminal. Ahora quiero matar el guión.
Presionar a Ctrl + C
veces no es suficiente, creo que porque a veces el script está ejecutando otro programa, y por alguna razón la señal de apagado no funciona.
Sin embargo, si cierro la ventana de terminal, mata el script.
¿Hay algo que pueda hacer (una combinación de teclado), que sea análogo a cerrar la ventana de terminal, sin cerrar realmente la ventana de terminal (no quiero perder el historial de comandos, el directorio actual, el historial de salida, etc.)?
Ctrl + z
Ctrl + z
correr:kill -9 $(pgrep -f your_script.sh)
Respuestas:
Tienes pocas opciones. Una es detener el script ( CtrlZ), obtener el PID del script y enviarlo
SIGKILL
al grupo de proceso.Cuando un comando se ejecuta en un shell, el proceso se inicia y todos sus elementos secundarios 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 en este grupo, debe enviarla al líder del proceso. Para el
kill
comando, el líder del proceso se denota así:¿Dónde
PID
está el ID de proceso del script?Ejemplo:
Considere una secuencia de comandos
test.sh
que inicia algunos procesos. Digamos que lo ejecutó en un shell:En otra terminal
En este caso, para enviar una señal al grupo de procesos creado por
test.sh
, haría lo siguiente:-INT
se usa para enviarSIGINT
, por lo que este comando equivale a presionar CtrlCel terminal. Para enviarSIGKILL
:Solo necesita detener el script si no puede abrir otra terminal. Si puede, use
pgrep
para encontrar el PID.Uno de los comandos que lanza el script puede ser atrapar
SIGINT
, por lo que probablemente no CtrlCsea efectivo. Sin embargo,SIGKILL
no puede quedar atrapado, y generalmente es una opción de último recurso . Es posible que desee probarSIGTERM
(-TERM
) antes de matar. Ninguno de los dosSIGKILL
, oSIGTERM
se puede configurar como un atajo de teclado el caminoSIGINT
es.Todo esto es discutible si su script no contiene una línea shebang. De esta respuesta SO :
Debido a esto, cuando se ejecuta el script, no encontrará un proceso con el nombre del script (o un proceso con el nombre del script en la línea de comando) y
pgrep
fallará.Siempre use una línea shebang.
fuente
SIGKILL
oSIGTERM
?pgrep test.sh
no me devuelve el PID. Intenté un simple test.sh:for i in {1..30}; do sleep 1 echo $i done
mientras setest.sh
está ejecutando, ejecutopgrep test.sh
en otro terminal, pero no se devuelve nada. Que pasapgrep -f test.sh
.pgrep -f test.sh
tampoco funciona./test.sh
Si conoce los procesos que están asociados con el script, puede encontrar su PID usando
y luego use el número PID para matar los procesos correspondientes usando
fuente
Como dijo Harris, podría ejecutar,
Kill -9 PID_Number
pero también podría instalar el paquete conocidohtop
por tener un navegador de procesos interactivo que facilita mucho la búsqueda de procesos específicos. htop también admite procesos de eliminación.fuente