7

Cygwinシェル スクリプトで生成したプロセスがあり、killコマンドでそれを強制終了できません。オプションでCygwin を killしても、-f次のメッセージが表示されます。

kill: couldn't open pid 1234

PsKillで強制終了したいのですが、 を理解できる に変換する方法が見つかりませCygwin PIDん。どうやってやるの?Windows PIDPsKill

4

6 に答える 6

9

bash ビルトインの代わりに cygwin kill を実行してみましたか? Windows PID の場合は、次のように入力します。

/bin/kill -f 1234

Cygwin PID の場合は、次のように入力します。

/bin/kill -9 1234

私の知る限り、Cygwin PID を Windows PID に変換するために呼び出すことができる Cygwin の API はありません。ただし、出力を解析ps -Wして変換を行うことができます。または、本当にそうしたくない場合は、Cygwinpsコマンドのソース コードを調べて、pid の取得元を確認してください。Cygwin ps のソース コードはこちらです。. C で小さなユーティリティを作成して、Cygwin pid を取得し、Windows pid を取得できます。

于 2009-11-05T09:31:04.843 に答える
9

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

または、次のようにプログラムで実行できます。

#include <sys/cygwin.h>
winpid = cygwin_internal(CW_CYGWIN_PID_TO_WINPID, cygpid);
于 2009-11-05T09:32:49.630 に答える
0

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



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

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

于 2016-09-07T19:24:04.380 に答える