Ich habe einen Prozess, den ich mit einem Cygwin Shell-Skript spawne, und ich kann ihn nicht mit dem Befehl kill
beenden. Selbst mit dem Cygwin-Kill mit der -f
-Option bekomme ich diese Nachricht :
Ich möchte versuchen, es mit PsKill zu killen, aber ich kann keinen Weg finden, den Cygwin PID
zu Windows PID
das PsKill
wird verstehen. Wie kann ich das tun?
Hast du versucht, den Cygwin-Kill anstelle des Bash-Builds auszuführen? Wenn es sich um eine Windows-PID handelt, geben Sie Folgendes ein:
%Vor%oder wenn es eine Cygwin PID ist, dann tippe:
%Vor% Soweit ich weiß, gibt es für Cygwin keine API, die Sie aufrufen könnten, um eine Cygwin-PID in eine Windows-PID zu übersetzen. Sie könnten jedoch die Ausgabe von ps -W
analysieren, um die Konvertierung durchzuführen. Oder, wenn Sie das wirklich nicht wirklich wollen, dann schauen Sie sich den Quellcode für den Cygwin ps
-Befehl an und sehen Sie, woher sie die PIDs bekommen. Der Cygwin ps Quellcode ist hier. . Sie könnten ein kleines Dienstprogramm in C schreiben, um die Cygwin-PID zu nehmen und Ihnen eine Windows-PID zu geben.
ps -W
zeigt die Windows PID zusätzlich zur Cygwin PID an.
Oder Sie können es programmgesteuert so machen:
%Vor% Das proc-Dateisystem hat die Windows-PID für cygwin PID $ pid in /proc/$pid/winpid
.
Dies funktioniert in Sh-Shell:
%Vor%Z_BIN enthält Ihr auszuführendes Programm. Z_PID enthält cygwin pid und Z_PIDW enthält Windows pid für das gleiche Programm. Sie können Z_PIDW in einer PID-Datei speichern und später zum Töten oder für andere Zwecke verwenden.
Ich habe im Internet gesucht, um festzustellen, ob jemand eine Funktion oder ein Skript zum Konvertieren von cygwin PIDs in Microsoft PIDs hat. Ich habe keine gefunden; also habe ich mein eigenes gemacht. Ich stelle es hier zur sicheren Aufbewahrung auf (wenn ich keinen Zugriff auf meine Lebensdauer von Skripten habe, die ich programmiert habe). Dies wird eine häufige Lösung für mich in freier Wildbahn.
%Vor% %Vor%
Verwenden Sie den Dateideskriptor, wenn Sie können, und verwenden Sie statt dieser Pipe.
Der beste Weg, laufende Bash-Skripte von Cygwin zu beenden, ist das Sysinternals -Tool PsKill64.exe
. Der Grund ist, dass Cygwins ps
auch PIDs gibt, die sich von WINPID
unterscheiden.
Darüber hinaus enthält pskill
auch das Flag -t
, das den gesamten Prozessbaum, dh alle anderen Threads / Subprozesse, die Ihr Skript möglicherweise gestartet hat, beendet. Natürlich funktioniert auch kill -9 <PID>
, aber es werden keine Nachfolger gelöscht, die bereits vom Skript gestartet wurden.
Lauf jetzt mit:
%Vor% Wie Sie sehen, werden zwei Prozesse gestartet, das Hauptprogramm bash
und der Thread für den Ruhezustand. Wenn du also kill -1 8132
hast, wird der Schlaf-Thread weiter ausgeführt, aber wenn du pskill64 -t 8132
benutzt, wirst du auch alle seine Nachkommen töten. Analog zum Befehl linux killall
.
Tags und Links shell cygwin sysinternals