La mejor manera de matar a la ejecución de scripts Bash de Cygwin está utilizando la herramienta PsKill64.exe
Sysinternals. El motivo es que Cygwin's ps
también proporciona PID que son diferentes de WINPID
.
Además, pskill
también tiene el indicador -t
que mata todo el árbol de procesos, lo que significa cualquier otro subprocesos/subprocesos que su secuencia de comandos pueda haber iniciado. Por supuesto, kill -9 <PID>
también funciona, pero no mata descendientes ya iniciados por el script.
# cat sleeper.sh
ZID=$$
WINPID=$(cat /proc/${ZID}/winpid)
echo "WINPID: ${WINPID}"
sleep 10
Ahora ejecute con:
$ ./sleeper.sh &
[1] 8132
WINPID: 8132
$ ps
PID PPID PGID WINPID TTY UID STIME COMMAND
#5280 1 5280 5280 ? 1001 14:21:40 /usr/bin/mintty
#7496 5684 7496 3836 pty0 1001 20:48:12 /usr/bin/ps
#5684 5280 5684 6052 pty0 1001 14:21:40 /usr/bin/bash
5948 8132 8132 3900 pty0 1001 20:48:11 /usr/bin/sleep
8132 5684 8132 8132 pty0 1001 20:48:11 /usr/bin/bash
Como se ve, este comienza dos procesos, el principal bash
guión y el hilo del sueño. Entonces, si kill -1 8132
el hilo de suspensión continuará ejecutándose, pero si usa pskill64 -t 8132
, también matará a todos sus descendientes. De forma análoga al comando linux killall
.
Sí, es la muerte de Cygwin que estoy usando. Intenté/bin/kill -f -9 1234 y/bin/kill -9 1234 sin éxito. 1234 es un PID de Cygwin. – Jazz
Si usa -f, debe darle el Windows PID de ps -W –
Además de esta gran respuesta, a veces, cuando el proceso está bloqueado desde dentro de Windows, Cygwin kill genera el mensaje "could not open pid 1234". El proceso necesita ser desbloqueado desde adentro de Windows primero. – Secko