Cygwin PID를 Windows PID로 변환하십시오
-
16-09-2019 - |
해결책
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
명령.