문제

나는 a와 함께 생성 된 과정이 있습니다 Cygwin 쉘 스크립트, 그리고 나는 그것을 kill 명령. 조차도 Cygwin 킬 이랑 -f 옵션, 나는이 메시지를 받는다 :

kill: couldn't open pid 1234

나는 그것을 죽이려고하고 싶습니다 PSKILL, 그러나 나는 전환하는 방법을 찾을 수 없습니다. Cygwin PID a Windows PID 저것 PsKill 이해할 것이다. 어떻게 할 수 있습니까?

도움이 되었습니까?

해결책

Bash 내장 대신 Cygwin Kill을 실행 해 보셨습니까? Windows PID 인 경우 다음을 입력하십시오.

/bin/kill -f 1234

또는 Cygwin Pid 인 경우 다음을 입력하십시오.

/bin/kill -9 1234

내가 아는 한, cygwin에 대한 API가 없어 Cygwin PID를 Windows PID로 번역 할 수 있습니다. 그러나 출력을 구문 분석 할 수 있습니다 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에 대한 Windows Pid가 있습니다. /proc/$pid/winpid.

> notepad&
[1] 11716
> taskkill /f /pid $(</proc/$!/winpid)
ERFOLGREICH: Der Prozess mit PID 11976 wurde beendet.
[1]+  Exit 1                  notepad

이것은 Sh Shell에서 작동합니다.

./${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 파일에 저장하고 나중에 살해 또는 다른 목적으로 사용할 수 있습니다.

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}

해당 파이프 대신 가능할 때 파일 디스크립터를 사용하십시오.

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, 당신도 그 후손들도 죽일 것입니다. 리눅스와 유사합니다 killall 명령.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top