質問

私はaでスポーンするプロセスがあります Cygwin シェルスクリプト、そして私はそれを殺すことができません kill 指図。でも Cygwin Kill とともに -f オプション、私はこのメッセージを受け取ります:

kill: couldn't open pid 1234

一緒に殺そうとします pskill, 、しかし、私は変換する方法を見つけることができません Cygwin PIDWindows PID それ PsKill 理解するでしょう。どうやってやるの?

役に立ちましたか?

解決

Bash Builtinの代わりにCygwin Killを実行しようとしましたか? Windows PIDの場合は、入力してください。

/bin/kill -f 1234

または、Cygwin PIDの場合は、次を入力します。

/bin/kill -9 1234

私が知る限り、CygwinにCygwin PIDをWindows PIDに翻訳するために呼び出すことができるAPIはCygwinにありません。ただし、の出力を解析できます ps -W コンバージョンを行うために。または、本当に、本当にそうしたくない場合は、Cygwinのソースコードを見てください ps コマンド、そして彼らがどこからPIDを得るかを見てください。 Cygwin PSソースコードはこちらです。. 。 Cに小さなユーティリティを書いて、Cygwin PIDを採取し、Windows PIDを与えることができます。

他のヒント

ps -W Cygwin PIDに加えて、Windows PIDが表示されます。

または、これをプログラム的に行うことができます:

#include <sys/cygwin.h>
winpid = cygwin_internal(CW_CYGWIN_PID_TO_WINPID, cygpid);

Procファイルシステム cygwin pid $ pid for CygwinのWindowsPIDがあります /proc/$pid/winpid.

> notepad&
[1] 11716
> taskkill /f /pid $(</proc/$!/winpid)
ERFOLGREICH: Der Prozess mit PID 11976 wurde beendet.
[1]+  Exit 1                  notepad

これはshシェルで機能します:

./${Z_BIN} &
Z_PID=$!
Z_PIDW=`ps -p ${Z_PID} | awk -e '/^[[:space:]]+[[:digit:]+]/{print $4}'`

Z_BINには、実行するプログラムが含まれています。 Z_PIDにはCygwin PIDが含まれ、Z_PIDWには同じプログラムのWindows PIDが含まれます。 Z_PIDWをPIDファイルに保存し、後で殺しや他の目的に使用できます。

Webを検索して、Cygwin PIDSをMicrosoft PIDSに変換する機能やスクリプトがあるかどうかを確認しました。私は何も見つけませんでした。だから私は自分で作った。安全な維持のためにここに置いています(プログラムしたスクリプトの生涯にアクセスできない場合)。これは、野生で私にとって頻繁な解決策になりつつあります。



    #!/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}

可能なときにファイル記述子を使用し、そのパイプの代わりに使用します。

Cygwinからランニングバッシュスクリプトを殺す最良の方法は、 sysinternals 道具 PsKill64.exe. 。その理由は、Cygwinのものです ps また、異なるPIDを与えます WINPID.

加えて、 pskill またあります -t プロセスツリー全体を殺すフラグは、スクリプトが開始した他のスレッド/サブプロセスを意味します。もちろん kill -9 <PID> また、機能しますが、スクリプトによってすでに開始された子孫を殺すことはありません。

# cat sleeper.sh
ZID=$$
WINPID=$(cat /proc/${ZID}/winpid)
echo "WINPID: ${WINPID}"
sleep 10

今すぐ実行します:

$ ./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

ご覧のとおり、これは2つのプロセスを開始します。 bash スクリプトとスリープスレッド。だからあなたの場合 kill -1 8132 スリープスレッドは実行され続けますが、使用する場合 pskill64 -t 8132, 、あなたもそのすべての子孫を殺すでしょう。 Linuxに類似しています killall 指図。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top