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?

È stato utile?

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);

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top