转换Cygwin PID到Windows PID
-
16-09-2019 - |
解决方案
你有没有尝试运行cygwin杀了而不是砸builtin?如果它是Windows PID然后键入:
/bin/kill -f 1234
或者如果它是一个Cygwin PID然后键入:
/bin/kill -9 1234
据我所知,没有API Cygwin,你可以打电话翻译Cygwin PID到Windows PID。但是,你能分析出的 ps -W
要做到转换。或者,如果你真的,真的不想做到这一点,然后看看源代码的Cygwin ps
命令,并看到他们在那里得到的pid。Cygwin ps源代码也在这里。.你可以写一个小型实用在C采取Cygwin pid,并给你一个窗pid。
其他提示
ps -W
将显示视窗PID除了Cygwin的PID。
或者,你可以做到这一点编程方式是这样的:
#include <sys/cygwin.h>
winpid = cygwin_internal(CW_CYGWIN_PID_TO_WINPID, cygpid);
具有窗口PID用于/proc/$pid/winpid
cygwin的PID $ PID的 proc文件系统。
> 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将包含窗口PID为相同的程序。您可以保存Z_PIDW到一个PID文件,并在以后使用杀伤或任何其他目的。
我在网上搜索,看看是否有人有一个函数或脚本的cygwin的PID转换成微软的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}
使用的文件描述符的时候就可以,并改用管道。
杀从Cygwin的运行bash脚本的最佳方法是使用的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
如你所见,这将启动两个进程,主要bash
脚本和睡眠线程。所以,如果你kill -1 8132
睡眠线程将继续运行,但如果你使用pskill64 -t 8132
,你会杀了它的所有后代了。类似于在linux killall
命令。