Convertire un Cygwin PID a un PID di Windows
-
16-09-2019 - |
Domanda
Ho un processo che Spawn con un href="http://www.cygwin.com/" rel="nofollow noreferrer"> Cygwin shell script kill. Anche con la Cygwin uccidere con l'opzione -f
, ottengo questo messaggio:
kill: couldn't open pid 1234
Vorrei cercare di uccidere con PsKill , ma non riesco a trovare un modo per convertire il Cygwin PID
ad un Windows PID
che PsKill
capirà. Come posso fare?
Soluzione
Hai provato in esecuzione il Cygwin uccidere al posto del builtin bash? Se si tratta di un PID di Windows digitare:
/bin/kill -f 1234
o se si tratta di un Cygwin PID quindi digitare:
/bin/kill -9 1234
Per quanto ne so non v'è alcuna API per Cygwin che si potrebbe chiamare per tradurre un Cygwin PID a un PID di Windows. Tuttavia, si potrebbe analizzare l'output di ps -W
per eseguire la conversione. O, se davvero, davvero non si vuole farlo, allora dare un'occhiata al codice sorgente per il comando ps
Cygwin, e vedere dove ottengono i PID da. Il Cygwin ps codice sorgente è qui. . Si potrebbe scrivere una piccola utility in C per prendere il Cygwin pid e vi darò un pid di Windows.
Altri suggerimenti
ps -W
mostrerà il PID di Windows oltre al Cygwin PID.
In alternativa, si può fare a livello di codice in questo modo:
#include <sys/cygwin.h>
winpid = cygwin_internal(CW_CYGWIN_PID_TO_WINPID, cygpid);
Il file system proc rel="noreferrer"> href="https://en.wikipedia.org/wiki/Procfs" ha le finestre PID per Cygwin PID $ pid in /proc/$pid/winpid
.
> notepad&
[1] 11716
> taskkill /f /pid $(</proc/$!/winpid)
ERFOLGREICH: Der Prozess mit PID 11976 wurde beendet.
[1]+ Exit 1 notepad
Questo funziona in guscio sh:
./${Z_BIN} &
Z_PID=$!
Z_PIDW=`ps -p ${Z_PID} | awk -e '/^[[:space:]]+[[:digit:]+]/{print $4}'`
Z_BIN contiene il programma da eseguire. Z_PID conterrà Cygwin pid e Z_PIDW conterrà finestre pid per lo stesso programma. È possibile salvare Z_PIDW in un file pid e utilizzarla in seguito per l'uccisione o di qualsiasi altro scopo.
Ho cercato il web per vedere se qualcuno aveva una funzione o uno script per convertire PID Cygwin a Microsoft PID. Ho trovato nessuno; così ho fatto la mia. Io sto mettendo su qui per mantenere sicuro (quando io non ho accesso alla mia vita in tempo di script che ho programmato). Questo sta diventando una soluzione frequente per me fuori nel selvaggio.
#!/usr/bin/env bash
# Convert a cygwin PID to a Microsoft PID using bash and perl
ps -W | perl -e '
my ($line, $arg,$errno,@columns);
$errno=1;
while($line = ){
chomp($line);
$line=~s/^\s+//g;s/\s+$//g;
for $arg (@ARGV){
if ($line=~/^${arg}/){
$errno=0;
@columns=split(/\s+/,$line);
print STDOUT $columns[3];
last;
}
}
}
exit($errno);
' "${@}"
The kill using `taskkill` and/or `kill` cygwin terminal.
<pre><code>
taskkill /F /IM ${m1crosoft_pid_goes_here}
kill -9 ${cygwin_pid_goes_here_tmp}
descrittore Usa file quando si può e utilizzare al posto di quel tubo.
Il modo migliore per uccidere l'esecuzione di script Bash da Cygwin sta usando il Sysinternals strumento PsKill64.exe
. La ragione è che ps
di Cygwin anche dare PID di diverse da WINPID
.
Inoltre, pskill
ha anche la bandiera -t
che uccide l'intero albero processo, il che significa che tutti gli altri fili / sottoprocessi che lo script potrebbe essere iniziato. Naturalmente kill -9 <PID>
funziona anche, ma non uccide discendenti già iniziate da script.
# cat sleeper.sh
ZID=$$
WINPID=$(cat /proc/${ZID}/winpid)
echo "WINPID: ${WINPID}"
sleep 10
Ora correre con:
$ ./sleeper.sh &
[1] 8132
WINPID: 8132
$ ps
PID PPID PGID WINPID TTY UID STIME COMMAND
#5280 1 5280 5280 ? 1001 14:21:40 /usr/bin/mintty
#7496 5684 7496 3836 pty0 1001 20:48:12 /usr/bin/ps
#5684 5280 5684 6052 pty0 1001 14:21:40 /usr/bin/bash
5948 8132 8132 3900 pty0 1001 20:48:11 /usr/bin/sleep
8132 5684 8132 8132 pty0 1001 20:48:11 /usr/bin/bash
Come si vede, questo inizia due processi, lo script bash
principale e il filo di sonno. Quindi, se si kill -1 8132
il filo del sonno continua a funzionare, ma se si utilizza pskill64 -t 8132
, si ucciderà tutti i suoi discendenti troppo. Analogamente al comando linux killall
.