Der beste Weg, Bash-Skripte von Cygwin zu töten läuft das Sysinternals Werkzeug PsKill64.exe
verwenden. Der Grund ist, dass Cygwins ps
auch PIDs gibt, die sich von WINPID
unterscheiden.
Darüber hinaus hat pskill
auch die -t
Flag, die den gesamten Prozessbaum, der alle anderen Threads/Sub-Prozesse, die Ihr Skript möglicherweise gestartet haben, tötet. Natürlich funktioniert auch kill -9 <PID>
, aber Nachkommen, die bereits vom Skript gestartet wurden, werden nicht gelöscht.
# cat sleeper.sh
ZID=$$
WINPID=$(cat /proc/${ZID}/winpid)
echo "WINPID: ${WINPID}"
sleep 10
Jetzt laufen mit:
$ ./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
Wie Sie sehen, diese beiden Prozesse beginnt, die Haupt bash
Skript und den Schlaf-Thread. Also, wenn Sie kill -1 8132
der Schlaf-Thread wird weiterhin ausgeführt werden, aber wenn Sie pskill64 -t 8132
verwenden, werden Sie auch alle seine Nachkommen töten. Analog zum Linux Befehl.
Ja, es ist die Cygwin-Tötung, die ich benutze. Ich habe/bin/kill -f -9 1234 und/bin/kill -9 1234 ohne Erfolg versucht. 1234 ist eine Cygwin PID. – Jazz
Wenn Sie -f verwenden, dann sollten Sie es geben die Windows-PID von ps -W –
Abgesehen von dieser großen Antwort - manchmal, wenn der Prozess von Windows gesperrt ist, erzeugt Cygwin kill die Meldung "konnte Pid 1234 nicht öffnen". Der Prozess muss dann zuerst aus Windows heraus entsperrt werden. – Secko