Come uccidere un processo di Windows in un terminale Cygwin?


18

Ho un problema su come interrompere un processo in Cygwin su Windows. Sono completamente nuovo per Cygwin. Ma ho un compito che non posso semplicemente uccidere. Ho provato a emettere i seguenti comandi:

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

Ho emesso i comandi in un terminale Cygwin separato poiché non riesco a Ctrl + C nel terminale Cygwin in cui viene eseguito il processo. Ho cercato su Internet senza successo.


Qual è il processo che hai avviato e come lo hai avviato?
me_e

Risposte:


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

O

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

O

powershell kill -n calc

Potresti voler usare ps -W | awk 'BEGIN{ IGNORECASE=1;} /calc.exe/,NF=1' | xargs kill -fperché Windows non fa distinzione tra maiuscole e minuscole
tricasse il

7

Puoi provare:

taskkill /pid 4568

taskkill /im:{name-of-executable}è utile anche.
LawrenceC,

ed taskkill /im <name-of-exe> /fè ancora più utile.
Erik Kaplun,

1
Risposta errata, l'OP ha chiesto un comando Cygwin.
Hashim,

1
È taskkill //im <name-of-exe>(nota la necessità di 2 barre)
P.Brian.Mackey,

5

Se vuoi una soluzione solo BASH, prova questo: (funziona per me)

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

NOTA: utilizzare / bin / kill, l'uccisione della shell incorporata non ucciderà i PID per i processi generali di Windows.


La tua nota su / bin / kill vs shell kill è stata molto utile. Grazie
Phil,

2

(Dalla mia risposta a una domanda simile su SO ):

Diversi programmi Windows gestiranno i segnali che uccidono gli invii in modo diverso; non sono mai stati progettati per gestirli allo stesso modo dei programmi Linux / Cygwin.

L'unico metodo affidabile per uccidere un programma Windows è utilizzare uno strumento specifico di Windows, come Task Manager o Process Explorer.

Detto questo, se non lo hai già fatto, potresti avere fortuna con l'esecuzione del tuo terminale Cygwin in modalità amministratore (fai clic destro sul collegamento e seleziona "Esegui come amministratore").


1

Due cose a cui pensare qui:

  1. Ottieni il PID corretto, che è WINPID.
  2. Usa lo strumento giusto.

Per ottenere il WINPID corretto da uccidere, utilizzare cat /proc/<PID>/winpid. Vale a dire questo:

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

e subito dopo ne facciamo un altro ps.

Lo strumento giusto da usare è sysinternals PsKill64.exe -t <winpid> che uccide anche tutti i discendenti del processo di script, che killnon lo fa.


1
Hai ottenuto un voto cat /proc/${ZID}/winpid, molto bello da sapere. E più veloce della soluzione con ps -aW | grep ..., almeno sul mio cygwin con Win 7 x64. Ma per PsKill64 penso che sia necessario -tuccidere i sottoprocessi e taskkillanche i sottoprocessi.
244an

Sì, devi anche -tuccidere i discendenti. Risposta corretta.
not2qubit

0

Se si dispone di un programma Windows che è un sottoprocesso nell'ambito di un processo cygwin bash che è possibile utilizzare taskkill /F /PID [the cygwin process id] /Tper interrompere l'albero del processo, non è necessario ottenere il PID di Windows pscon awkecc.
Questo è testato in Win7 x64.

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

Ovviamente puoi usare anche il PID di Windows.


0

In Git Bash uso:

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

Non l'ho provato su Cygwin, ma suppongo che funzionerà anche lì.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.