답변:
프로세스가 있는지 확인하려면 다음을 사용하십시오.
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
kill
프로세스를 죽일 필요는 없다는 점에서 다소 잘못 명명되었습니다. 프로세스에 신호를 보냅니다. kill $PID
는 kill -15 $PID
신호 15, SIGTERM을 프로세스로 보내는 명령 과 동일하며 이는 종료 명령입니다. 신호 0이 없습니다. 이는 신호 kill
가 프로세스로 전송 될 수 있는지 여부를 확인 하는 특수한 값입니다 . 이는 대부분의 경우 존재 여부를 확인하는 것과 거의 비슷합니다. linux.die.net/man/2/kill 및 linux.die.net/man/7/signal
kill -0
실제로 사용 하기 위해 이것을해야한다고 생각합니다 : kill -0 25667 ; echo $?
-그리고 나서 0
반환을 얻으면 그 PID를 가진 프로세스가 종료 될 수 있습니다. 프로세스 PID (예 :)가 존재하지 않는 경우 $?
는 1
실패를 나타냅니다. 그 맞습니까?
가장 좋은 방법은 다음과 같습니다.
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"파일을 다른 것으로 호출하기로 결정한 경우 어떻게해야합니까?
-p
적어도 그 경우에는 불필요합니다. ps $PID
결과는 동일합니다.
if [ -n "$PID" -a -e /proc/$PID ]; then
echo "process exists"
fi
또는
if [ -n "$(ps -p $PID -o pid=)" ]
후자의 형식에서는 -o pid=
헤더가없는 프로세스 ID 열만 표시하기위한 출력 형식입니다. 비어 있지 않은 문자열 연산자 가 유효한 결과를 제공하려면 따옴표가 필요 합니다 -n
.
if ps -p"$PID" -o "pid=" >/dev/null 2>&1; then echo "Process is running..."; fi
ps
옵션과 기능은 플랫폼마다 다르므로 여전히 완전히 이식 가능한 것은 아닙니다.
$PID
비어있는 경우 디렉토리가 여전히 존재 [ -e /proc/$PID ]
하므로 여전히 true를 리턴 /proc/
합니다.
두 가지 방법이 있습니다.
내 노트북에서 특정 응용 프로그램을 찾아 보자.
[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"를 사용하십시오.
/proc/$PID/exe
일반 파일이 아닙니다. 따라서 [ -f /proc/$PID/exe ]
항상 false
결과를 반환합니다 . 시도하십시오 [ -h /proc/$PID/exe ]
.
나는 이것이 나쁜 해결책이라고 생각합니다. 테스트와 테스트 요청 사이에 프로세스가 종료되면 어떻게됩니까? 그러면 죽일 것입니다. 그렇다면 모든 경우에 킬을 시도하고 반환 값을 확인하여 어떻게 진행되었는지 확인하십시오.
kill -9
. 그것은 프로세스를 즉시 중단시켜 자체적으로 정리할 기회를 제공하지 않습니다. 대신 kill
에 해당 하는를 사용하십시오 kill -15
. 그래도 문제가 해결되지 않으면 이유를 찾아야하며 최후의 수단으로 만 사용해야 kill -9
합니다.
여기서 PID를 .pid (/ run / ...와 같은 파일) 파일에 저장하고 아직 실행되지 않은 경우에만 스크립트를 실행합니다.
#!/bin/bash
if [ -f .pid ]; then
read pid < .pid
echo $pid
ps -p $pid > /dev/null
r=$?
if [ $r -eq 0 ]; then
echo "$pid is currently running, not executing $0 twice, exiting now..."
exit 1
fi
fi
echo $$ > .pid
# do things here
rm .pid
참고 : pid가 어떻게 호출되는지 확인하지 않으므로 경쟁 조건이 있습니다. 시스템이 재부팅되고 .pid가 존재하지만 다른 응용 프로그램에서 사용되는 경우 '예기치 않은 결과'가 발생할 수 있습니다.
예를 들어 GNU / Linux에서는 다음을 사용할 수 있습니다.
Pid=$(pidof `process_name`)
if [ $Pid > 0 ]; then
do something
else
do something
fi
아니면 같은
Pin=$(ps -A | grep name | awk 'print $4}')
echo $PIN
앱 이름과 ID가없는 이름 만 표시됩니다.
pidof
음수 PID는 의미가 없으므로 음수를 반환하지 않으므로 kill 할 수 없으므로 init
조건부에는 의미가 없습니다 (또한 >
리디렉션을 수행하지 못하게 하려면 이스케이프해야합니다 ). 당신은 빈 결과를 확인하기를 원하지만 물론, 어떤 점잖은 도구처럼, pidof
그것은 작동 여부를 적절한 솔루션입니다, 그래서 당신에게하는 종료 코드를 설정 if Pid=$(pidof 'process_name'); then ...
하거나 (당신이 값이 필요하지 않을 경우 Pid
나중에) 단지를if pidof 'process_name'; then...
아래 코드는 내 프로세스가 실행 중인지 확인합니다.
프로세스가 실행되고 있지 않은 경우에만 매시간 Amazon SQS에서 새 메시지를 확인하십시오.
#!/bin/bash
PID=$(ps aux | grep '/usr/bin/python2.7 manage.py SES__boto3_sqs_read' | grep -v grep | awk '{print $2}')
if [[ -z $PID ]]; then
/usr/bin/python2.7 /home/brian/djcode/proyectoONE/manage.py SES__boto3_sqs_read
else
echo "do nothing, just smile =)"
fi
exit $?