のCygwinから実行しているbashのスクリプトを殺すための最良の方法は、SysinternalsツールPsKill64.exe
を使用しています。理由は、Cygwinのps
もWINPID
とは異なるPIDを与えるからです。
さらに、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
コマンドに似ています。
はい、それは私が使っているCygwinのkillです。私は/ bin/kill -f -9 1234と/ bin/kill -9 1234を成功させました。 1234はCygwin PIDです。 – Jazz
-fを使用する場合、ps -W –
からWindows PIDを与えるべきです。この素晴らしい答えは別として、プロセスがWindowsの内側からロックされている場合、Cygwinのkillは "could not open pid 1234"というメッセージを生成します。このプロセスはWindowsの内部から最初にアンロックする必要があります。 – Secko