Cygwinシェル スクリプトで生成したプロセスがあり、kill
コマンドでそれを強制終了できません。オプションでCygwin を killしても、-f
次のメッセージが表示されます。
kill: couldn't open pid 1234
PsKillで強制終了したいのですが、 を理解できる に変換する方法が見つかりませCygwin PID
ん。どうやってやるの?Windows PID
PsKill
Cygwinシェル スクリプトで生成したプロセスがあり、kill
コマンドでそれを強制終了できません。オプションでCygwin を killしても、-f
次のメッセージが表示されます。
kill: couldn't open pid 1234
PsKillで強制終了したいのですが、 を理解できる に変換する方法が見つかりませCygwin PID
ん。どうやってやるの?Windows PID
PsKill
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 を取得できます。
ps -W
Cygwin PID に加えて Windows PID が表示されます。
または、次のようにプログラムで実行できます。
#include <sys/cygwin.h>
winpid = cygwin_internal(CW_CYGWIN_PID_TO_WINPID, cygpid);
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}
可能な場合はファイル記述子を使用し、そのパイプの代わりに使用します。