bash 스크립트에서 다음을 수행하려고합니다 (의사 코드로).
if [ a process exists with $PID ]; then
kill $PID
fi
조건문에 대한 적절한 표현은 무엇입니까?
답변
프로세스가 있는지 확인하려면 다음을 사용하십시오.
kill -0 $pid
그러나 @unwind가 말했듯이 어쨌든 그것을 죽이려면
kill $pid
또는 경쟁 조건이 있습니다.
kill
종료 코드를 기반으로 텍스트 출력을 무시하고 무언가를 수행 하려는 경우
if ! kill $pid > /dev/null 2>&1; then
echo "Could not send SIGTERM to process $pid" >&2
fi
답변
가장 좋은 방법은 다음과 같습니다.
if ps -p $PID > /dev/null
then
echo "$PID is running"
# Do something knowing the pid exists, i.e. the process with $PID is running
fi
문제 :
kill -0 $PID
pid가 실행 중이고 종료 권한이 없어도 종료 코드는 0이 아닙니다. 예를 들면 다음과 같습니다.
kill -0 1
과
kill -0 $non-running-pid
일반 사용자를 위해 구별 할 수없는 (0이 아닌) 종료 코드를 가지고 있지만 초기화 프로세스 (PID 1)가 확실히 실행 중입니다.
토론
테스트의 본문이 “킬”인 경우 킬 및 레이스 조건에 대한 답변은 정확합니다. 나는 일반적인 ” bash에서의 PID 존재를 어떻게 테스트 하는가 “를 찾고왔다 .
/ proc 메소드는 흥미롭지 만 어떤 의미에서는 “ps”명령 추상화의 정신을 깨뜨립니다. 즉, Linus가 “exe”파일을 다른 것으로 호출하기로 결정한 경우 어떻게해야합니까?
답변
if [ -n "$PID" -a -e /proc/$PID ]; then
echo "process exists"
fi
또는
if [ -n "$(ps -p $PID -o pid=)" ]
후자의 형식에서는 -o pid=
헤더가없는 프로세스 ID 열만 표시하기위한 출력 형식입니다. 비어 있지 않은 문자열 연산자 가 유효한 결과를 제공하려면 따옴표가 필요 합니다 -n
.
답변
ps
와 함께 명령을 수행 -p $PID
할 수 있습니다 :
$ ps -p 3531
PID TTY TIME CMD
3531 ? 00:03:07 emacs
답변
두 가지 방법이 있습니다.
내 노트북에서 특정 응용 프로그램을 찾아 보자.
[root@pinky:~]# ps fax | grep mozilla
3358 ? S 0:00 \_ /bin/sh /usr/lib/firefox-3.5/run-mozilla.sh /usr/lib/firefox-3.5/firefox
16198 pts/2 S+ 0:00 \_ grep mozilla
모든 예제는 이제 PID 3358을 찾습니다.
첫 번째 방법 : “ps aux”를 실행하고 두 번째 열에서 PID를 grep하십시오. 이 예제에서는 firefox를 찾은 다음 PID를 찾습니다.
[root@pinky:~]# ps aux | awk '{print $2 }' | grep 3358
3358
따라서 코드는 다음과 같습니다.
if [ ps aux | awk '{print $2 }' | grep -q $PID 2> /dev/null ]; then
kill $PID
fi
두 번째 방법 : /proc/$PID
디렉토리 에서 무언가를 찾으십시오 . 이 예에서는 “exe”를 사용하고 있지만 다른 것을 사용할 수 있습니다.
[root@pinky:~]# ls -l /proc/3358/exe
lrwxrwxrwx. 1 elcuco elcuco 0 2010-06-15 12:33 /proc/3358/exe -> /bin/bash
따라서 코드는 다음과 같습니다.
if [ -f /proc/$PID/exe ]; then
kill $PID
fi
BTW : 무엇이 잘못 되었나요 kill -9 $PID || true
?
편집하다:
몇 달 동안 그것에 대해 생각한 후에 .. (약 24 …) 내가 여기에 낸 원래의 아이디어는 훌륭한 해킹이지만, 매우 이식하기 어려운 것입니다. Linux에 대한 몇 가지 구현 세부 사항을 가르치고 있지만 Mac, Solaris 또는 * BSD에서는 작동하지 않습니다. 향후 Linux 커널에서는 실패 할 수도 있습니다. 다른 답변에서 설명한대로 “ps”를 사용하십시오.
답변
네가 원하는 것 같아
wait $PID
$pid
완료 되면 반환됩니다 .
그렇지 않으면 사용할 수 있습니다
ps -p $PID
프로세스가 여전히 살아 있는지 확인하십시오 ( kill -0 $pid
pid를 소유하지 않아도 작동하기 때문에 보다 효과적입니다 ).
답변
나는 이것이 나쁜 해결책이라고 생각합니다. 테스트와 테스트 요청 사이에 프로세스가 종료되면 어떻게됩니까? 그러면 죽일 것입니다. 그렇다면 모든 경우에 킬을 시도하고 반환 값을 확인하여 어떻게 진행되었는지 확인하십시오.