Wie bricht man einen Windows-Prozess in einem Cygwin-Terminal ab?


18

Ich habe ein Problem beim Beenden eines Prozesses in Cygwin unter Windows. Ich bin ganz neu bei Cygwin. Aber ich habe eine Aufgabe, die ich einfach nicht töten kann. Ich habe versucht, die folgenden Befehle auszugeben:

kill 4568
kill -9 4568
/bin/kill -f 4568

Ich habe die Befehle in einem separaten Cygwin-Terminal ausgegeben, da ich sie im Cygwin-Terminal, in dem der Prozess ausgeführt wird, nicht mit Strg + C ausführen kann. Ich habe im ganzen Internet ohne Erfolg gesucht.


Wie hast du angefangen und wie hast du angefangen?
me_and

Antworten:


25
ps -W | awk '/calc.exe/,NF=1' | xargs kill -f

Oder

ps -W | awk '$0~v,NF=1' v=calc.exe | xargs kill -f

Oder

powershell kill -n calc

Möglicherweise möchten Sie verwenden, ps -W | awk 'BEGIN{ IGNORECASE=1;} /calc.exe/,NF=1' | xargs kill -fweil Windows die Groß- und Kleinschreibung nicht
berücksichtigt

7

Sie können versuchen:

taskkill /pid 4568

taskkill /im:{name-of-executable}ist auch nützlich.
LawrenceC

und taskkill /im <name-of-exe> /fist noch nützlicher.
Erik Kaplun

1
Schlechte Antwort, das OP hat nach einem Cygwin-Befehl gefragt.
Hashim

1
Es ist taskkill //im <name-of-exe>(beachten Sie die Notwendigkeit für 2 Schrägstriche)
P. Brian Mackey

5

Wenn Sie nur eine BASH-Lösung wünschen, versuchen Sie Folgendes: (funktioniert bei mir)

    KILLPS="<My Process Name>"
    WINPS=`ps -W | grep -i $KILLPS`         # Make case-insensitive.
    PID=`echo $WINPS | cut -d' ' -f1` 
    /bin/kill -f "$PID"

ANMERKUNG: Verwenden Sie / bin / kill. Mit der eingebetteten Shell kill werden PIDs für allgemeine Windows-Prozesse nicht beendet.


Ihre Anmerkung zu / bin / kill vs. shell kill war sehr nützlich. Danke
Phil

2

(Aus meiner Antwort auf eine ähnliche Frage zu SO ):

Verschiedene Windows-Programme behandeln die Signale, die die Sends beenden, unterschiedlich. Sie wurden nie so entwickelt, wie Linux / Cygwin-Programme damit umgehen.

Die einzige zuverlässige Methode zum Beenden eines Windows-Programms ist die Verwendung eines Windows-spezifischen Tools wie Task-Manager oder Prozess-Explorer.

Wenn Sie dies noch nicht getan haben, haben Sie möglicherweise Glück, wenn Sie Ihr Cygwin-Terminal im Administratormodus ausführen (klicken Sie mit der rechten Maustaste auf Ihre Verknüpfung und wählen Sie "Als Administrator ausführen" aus).


1

Zwei Dinge, über die Sie nachdenken sollten:

  1. Erhalten Sie die richtige PID, die die WINPID ist.
  2. Verwenden Sie das richtige Werkzeug.

Verwenden Sie, um die richtige WINPID zum Töten zu erhalten cat /proc/<PID>/winpid. Ich führe das aus:

ZID=$$; WINPID=$(cat /proc/${ZID}/winpid); echo "Kill WINPID: ${WINPID}"; ps; sleep 10 &

und unmittelbar danach einen anderen machen ps.

Das richtige Werkzeug ist sysinternals, PsKill64.exe -t <winpid> das auch alle Nachkommen des Skriptprozesses tötet, was killnicht der Fall ist.


1
Du hast eine Stimme bekommen cat /proc/${ZID}/winpid, sehr gut zu wissen. Und schneller als die Lösung mit ps -aW | grep ..., zumindest auf meinem Cygwin unter Win 7 x64. Aber für PsKill64 denke ich, dass Sie -tUnterprozesse beenden müssen und auch Unterprozesse beenden taskkillkönnen.
24.

Ja, Sie müssen auch die -tNachkommen töten. Antwort korrigiert.
not2qubit

0

Wenn Sie ein Windows-Programm haben, das ein Unterprozess im Rahmen eines Cygwin-Bash-Prozesses ist, mit dem Sie taskkill /F /PID [the cygwin process id] /Tden Prozessbaum beenden können , müssen Sie die Windows- PID nicht psmit awkusw.
abrufen. Dies wird unter Win7 x64 getestet.

# Simple example in cygwin:
> notepad.exe &
> pid=$!
...
> taskkill /F /PID $pid /T

Natürlich können Sie auch die Window PID verwenden.


0

In Git Bash verwende ich:

targetProcess='chromedriver.exe';
ps -W | grep -i ${targetProcess} | awk '{print $1}' | while read pid; do taskkill //PID ${pid}; done;

Ich habe es in Cygwin nicht ausprobiert, aber ich nehme an, dass es dort auch funktionieren wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.