Alternative zu "pkill" oder "pgrep -f" auf Cygwin?

8

Angenommen, ich habe meinen Prozess wie folgt gestartet:

java -DSOME_STRING -jar foo.jar

Dann kann ich unter Linux Folgendes verwenden, um diesen Prozess zu finden oder zu beenden:

pgrep -f SOME_STRING
pkill -f SOME_STRING

Dies scheint jedoch bei Cygwin nicht zu funktionieren. Kann jemand eine Alternative für diese Tools in Cygwin vorschlagen?

Toolkit
quelle
1
Funktioniert nicht auf welche Weise? Tötet den Prozess nicht ab, findet nicht den Prozess, um ihn zu beenden? Gibt einen Fehler?
EightBitTony
pgrep findet den Prozess nicht. pkill beendet den Prozess nicht.
Toolkit
Hier sind Implementierungen von killallund pidoffür Cygwin erstellt. Abhängig von Python 2 / - github.com/kata198/cygwin-ps-misc
Tim Savannah

Antworten:

16

pkill und pgrep existieren sicherlich innerhalb Cygwin, im procps Paket (Sie Cygwin - Pakete suchen hier ).

Es scheint für mich zu funktionieren,

tony:~$ nohup sleep 100983 &
[1] 5476
tony:~$ nohup: ignoring input and appending output to `nohup.out'
tony:~$
tony:~$ ps -ef | grep sleep
    tony    5476    2696   2  23:28:53 /usr/bin/sleep
tony:~$ pkill -f sleep
[1]+  Terminated              nohup sleep 100983
tony:~$

und

tony:~$ nohup sleep 837746 &
[1] 228
tony:~$ nohup: ignoring input and appending output to `nohup.out'
tony:~$ pgrep -f 837746
228
tony:~$ pkill -f 837746
[1]+  Terminated              nohup sleep 837746
tony:~$

Update: Okay, mit Java getestet. Das Ausführen von Java über die Cygwin-Befehlszeile führt nicht dazu, dass die Java-Zeichenfolge platziert wird /proc/<pid>/cmdline, die nur enthält -bash. Dies scheint eine Einschränkung von Cygwin zu sein.

tony:~$ java -Dsomething=valid -jar Captor.jar &
[1] 2700
tony:~$ ps -ef
     UID     PID    PPID TTY     STIME COMMAND
    tony    4164       1   ?    Aug 21 /usr/bin/mintty
    tony    4676    4164   0    Aug 21 /usr/bin/bash
    tony    5776    4676   0    Aug 23 /usr/bin/ssh
    tony    5148       1   ?  23:53:03 /usr/bin/mintty
    tony    5332    5148   1  23:53:03 /usr/bin/bash
    tony    5816       1   ?  00:04:16 /usr/bin/mintty
    tony    5432    5816   2  00:04:16 /usr/bin/bash
    tony    2700    5432   2  00:04:34 /cygdrive/c/Windows/system32/java
    tony    2232    5432   2  00:04:39 /usr/bin/ps
tony:~$ pgrep -f something
tony:~$ cat /proc/2700/cmdline
-bash
tony:~$
tony:~$ cat /proc/2700/exename
/cygdrive/c/Windows/system32/java

Ich vermute daher, die Antwort ist, dass Sie dies nicht mit einem Cygwin-Tool tun können, sondern ein Windows-spezifisches Tool benötigen würden.

EightBitTony
quelle
Ihr Beispiel unterscheidet sich wesentlich von dem, das das OP versucht. Sie haben den Namen des Prozesses und nicht eine beliebige Zeichenfolge in den Argumenten abgeglichen. Können Sie letzteres testen und sehen, ob das funktioniert?
Caleb
scheint gut zu funktionieren
EightBitTony
Es scheint, dass procps für x64 cygwin nicht verfügbar ist.
Thameera
1
@ thameera versuchen Paket procps-ng.
Abdull
1
apt-cyg install procps-ngmit neuesten Cygwin
Timo
4

Die Cygwin-Dienstprogramme funktionieren wie die Linux-Dienstprogramme, funktionieren jedoch nur mit Cygwin-Prozessen. Für Windows-Prozesse müssen Sie Windows-Dienstprogramme verwenden, z. B. die von Sysinternals . PsKill kann Prozesse mit Namen beenden .

Gilles 'SO - hör auf böse zu sein'
quelle
4
wie kann der Eingeborenetaskkill /f /im procname.exe
Marcos
2
pszeigt auch Windows-Prozesse mit dem -WSchalter
Golimar
4

In älteren Cygwin-Versionen gibt es ein procpsPaket, das Sie installieren können, um dieselbe Funktionalität mit denselben Befehlen zu erhalten.

In neueren Cygwin-Versionen existiert das procpsPaket nicht mehr und wird durch ein Paket ersetzt procps-ng.

Caleb
quelle