Cygwin PIDをWindows PIDに変換します
-
16-09-2019 - |
質問
私はaでスポーンするプロセスがあります Cygwin シェルスクリプト、そして私はそれを殺すことができません kill
指図。でも Cygwin Kill とともに -f
オプション、私はこのメッセージを受け取ります:
kill: couldn't open pid 1234
一緒に殺そうとします pskill, 、しかし、私は変換する方法を見つけることができません Cygwin PID
に Windows 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
指図。