我有一个过程我产生一个 Cygwin shell script,我无法杀死它的 kill 命令。即使有 Cygwin杀-f 选项,我得到这个消息:

kill: couldn't open pid 1234

我想尝试杀死它 PsKill, 但是我找不到的方式转换成 Cygwin PID 来一个 Windows PIDPsKill 将会理解的。我怎么可以那样做?

有帮助吗?

解决方案

你有没有尝试运行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);

这个工作在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命令。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top