Jak zabić proces systemu Windows w terminalu cygwin?

18

Mam problem z zabiciem procesu w Cygwin w systemie Windows. Jestem zupełnie nowy w Cygwin. Ale mam zadanie, którego po prostu nie mogę zabić. Próbowałem wydać następujące polecenia:

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

Wydałem polecenia w osobnym terminalu Cygwin, ponieważ nie mogę Ctrl + C w terminalu Cygwin, w którym działa proces. Szukałem w Internecie bez powodzenia.

użytkownik1093774
źródło
Jak rozpocząłeś proces i jak go rozpocząłeś?
me_ i

Odpowiedzi:

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

Lub

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

Lub

powershell kill -n calc
Steven Penny
źródło
Możesz użyć, ps -W | awk 'BEGIN{ IGNORECASE=1;} /calc.exe/,NF=1' | xargs kill -fponieważ system Windows nie rozróżnia wielkości liter
tricasse
7

Możesz spróbować:

taskkill /pid 4568
aggu
źródło
taskkill /im:{name-of-executable}jest również przydatny.
LawrenceC
i taskkill /im <name-of-exe> /fjest jeszcze bardziej przydatny.
Erik Kaplun,
1
Zła odpowiedź, OP poprosił o polecenie Cygwin.
Hashim
1
To taskkill //im <name-of-exe>(zwróć uwagę na potrzebę 2 ukośników)
P.Brian.Mackey
5

Jeśli chcesz tylko rozwiązania BASH, spróbuj tego: (działa dla mnie)

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

UWAGA: użyj / bin / kill, osadzone zabijanie powłoki nie zabije PID dla ogólnych procesów systemu Windows.

dpminusa
źródło
Twoja informacja o / bin / kill vs shell kill była bardzo przydatna. Dzięki
Phil,
2

(Od mojej odpowiedzi na podobne pytanie dotyczące SO ):

Różne programy systemu Windows będą obsługiwać sygnały, które zabijają wysyłanie w różny sposób; nigdy nie zostały zaprojektowane do radzenia sobie z nimi w taki sam sposób, jak programy Linux / Cygwin.

Jedyną niezawodną metodą zabicia programu Windows jest użycie narzędzia specyficznego dla systemu Windows, takiego jak Menedżer zadań lub Eksplorator procesów.

To powiedziawszy, jeśli jeszcze tego nie zrobiłeś, możesz mieć szczęście z uruchomieniem terminalu Cygwin w trybie administratora (kliknij prawym przyciskiem myszy skrót i wybierz „Uruchom jako administrator”).

ja i
źródło
1

Dwie rzeczy do przemyślenia tutaj:

  1. Uzyskaj poprawny PID, którym jest WINPID.
  2. Użyj właściwego narzędzia.

Aby uzyskać prawidłowy WINPID do zabicia, użyj cat /proc/<PID>/winpid. Uruchom to:

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

i zaraz potem zrób inną ps.

Właściwym narzędziem do użycia są sysinternals, PsKill64.exe -t <winpid> które zabijają również wszystkich potomków procesu skryptu, co killnie.

not2qubit
źródło
1
Masz głos na cat /proc/${ZID}/winpid, bardzo dobrze wiedzieć. I szybsze niż rozwiązanie z ps -aW | grep ..., przynajmniej na moim cygwinie pod Win 7 x64. Ale w przypadku PsKill64 myślę, że musisz -tzabić podprocesy, a taskkilltakże zabić podprocesy.
244
Tak, musisz także -tzabić potomków. Poprawiona odpowiedź
not2qubit,
0

Jeśli masz program Windows, który jest podprocesem w ramach procesu cygwin bash, możesz użyć go taskkill /F /PID [the cygwin process id] /Tdo zabicia drzewa procesów, nie musisz uzyskiwać PID z Windowsa za pspomocą awkitp.
Jest to testowane pod Win7 x64.

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

Oczywiście możesz także użyć Window PID.

244an
źródło
0

W Git Bash używam:

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

Nie próbowałem tego w Cygwin, ale przypuszczam, że tam też zadziała.

Vagelis Prokopiou
źródło