Konvertiere eine Cygwin PID in eine Windows PID

7

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 :

%Vor%

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?

    
Jazz 05.11.2009, 09:24
quelle

6 Antworten

10

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.

    
Michael Dillon 05.11.2009, 09:31
quelle
6

ps -W zeigt die Windows PID zusätzlich zur Cygwin PID an.

Oder Sie können es programmgesteuert so machen:

%Vor%     
Warren Young 05.11.2009 09:32
quelle
2

Das proc-Dateisystem hat die Windows-PID für cygwin PID $ pid in /proc/$pid/winpid .

%Vor%     
EndlosSchleife 01.07.2017 15:45
quelle
1

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.

    
user420783 17.11.2013 02:38
quelle
0

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.

    
MyMightyJoeYoung 07.09.2016 19:24
quelle
0

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.

%Vor%

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 .

    
not2qubit 04.11.2017 18:57
quelle

Tags und Links