프로세스 ID (PID)가 있는지 확인하는 방법
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"를 사용하십시오.
I think that is a bad solution, that opens up for race conditions. What if the process dies between your test and your call to kill? Then kill will fail. So why not just try the kill in all cases, and check its return value to find out how it went?
It seems like you want
wait $PID
which will return when $pid
finishes.
Otherwise you can use
ps -p $PID
to check if the process is still alive (this is more effective than kill -0 $pid
because it will work even if you don't own the pid).
code below checks if my process is running, if so do nothing.
let's check new messages from Amazon SQS every hour only and only if the process is not running.
#!/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 $?
here i store the PID in a file called .pid (which is kind of like /run/...) and only execute the script if not already being executed.
#!/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
note: there is a race condition as it does not check how that pid is called. if the system is rebooted and .pid exists but is used by a different application this might lead 'unforeseen consequences'.
For example in GNU/Linux you can use:
Pid=$(pidof `process_name`)
if [ $Pid > 0 ]; then
do something
else
do something
fi
Or something like
Pin=$(ps -A | grep name | awk 'print $4}')
echo $PIN
and that shows you the name of the app, just the name without ID.
참고URL : https://stackoverflow.com/questions/3043978/how-to-check-if-a-process-id-pid-exists
'IT story' 카테고리의 다른 글
응용 프로그램에 대한 실행 권한을 변경할 수 없습니다 (0) | 2020.05.27 |
---|---|
Swift에서 UIImageView 객체에 액션을 할당하는 방법 (0) | 2020.05.27 |
Observable.of는 함수가 아닙니다 (0) | 2020.05.27 |
Django 템플릿에서 사전 요소에 액세스하는 방법은 무엇입니까? (0) | 2020.05.27 |
PHP 7에서 ext-curl 확장을 어떻게 설치합니까? (0) | 2020.05.27 |