IT story

프로세스 ID (PID)가 있는지 확인하는 방법

hot-time 2020. 5. 27. 07:40
반응형

프로세스 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

반응형