PID가 실행 중인지 확인하는 올바른 방법은 무엇입니까?


12

나는이 .pid파일을, 그리고 프로세스가 실행되고 있는지 확인해야합니다. 지금까지 두 가지 옵션을 찾았습니다.

kill -0 `cat something.pid`

pid가 실행되고 있지 않으면 오류를 출력합니다. 나는 이것이 리디렉션 될 수 있다는 것을 알고 /dev/null있지만 이것이 최선의 해결책은 아니라고 생각합니다.

두 번째 해결책은을 사용 ps하는 것이지만 STDOUT에도 인쇄됩니다.

ps -ef `cat something.pid`

출력을 리디렉션하고 /dev/null반환 된 상태 코드를 사용하는 것이 정상입니까 , 아니면 내가 잘못하고 다른 명령이 필요하다는 신호입니까?


5
kill -0표준 (POSIX) 호환으로 사용하십시오 .
Anders

답변:


10

/ proc / {pid}를 열거하는 대부분의 리눅스 배포판에서 실행중인 프로세스에 대한 정보를 얻는 좋은 방법이며 일반적으로 "ps"와 같은 사용자 공간 명령이 커널과 통신하는 방법입니다. 예를 들어 할 수 있습니다.

[ -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists"

편집 : kpid가 설정되어 있는지 확인해야하지만 $ {kpid} 설정되지 않은 경우 "존재하지 않음"을 반환하므로 더 유용합니다

[ -n "${kpid}" -a -d "/proc/${kpid}" ] && echo "process exists" || echo "process not exists"

@SteveMuster 이것은 리눅스 고유의 답변을 만듭니다. OSX에는 / proc이 없습니다. 그리고 BSD에는 / proc이 없다고 생각합니다.
ash

당신이 할 필요가 이것에주의해야합니다 ${kpid}존재
윌프

@Wilf 편집 했으므로 $ {kpid}에 대해 "process 존재하지 않음"을 반환합니다.
Tom H

감사합니다-비슷한 방법을 사용하여 PID를 확인하는 스크립트를 작성했는데 이것이 문제라는 것을 알 때까지 작동하지 않았습니다. :)
Wilf

6

Anders가 지적했듯이 kill -0POSIX 준수에 사용해야 합니다.

Linux 시스템에서는 / proc 파일 시스템에 파일이 있는지 확인할 수도 있습니다 (예 :

-f /proc/$(cat something.pid)/status

1

이것이 스크립트에 있다면 (내가 stdout으로 인쇄하는 것이 걱정되는 경우라고 가정합니다) 다음과 같은 방법으로 수행 할 수 있습니다.

if ps -p $(cat something.pid) > /dev/null 2>&1
then
    kill $(cat something.pid)
else
    # Deal with the fact that the process isn't running
    # i.e. clear up the pid file
fi

ps -psomething.pid에 지정된 PID와 프로세스에 대한 외모합니다 ( $()구문은 역 따옴표의 약간 최신 버전입니다. 백틱는 새로운 형태하지 않는 특정 상황에서 탈출해야합니다). 2>&1리디렉션뿐만 아니라 해당 명령에 대해 stderr.

은 IF ps -p명령이 그 PID와 프로세스를 찾을 수없는 그것은 오류> 0으로 종료하고,이 때문에 else실행됩니다. 그렇지 않으면 kill진술. 원하는 경우 위의 내용을 무시할 수 있습니다.

if ! ps -p ...

그것이 귀하의 질문에 대답하기를 바랍니다. 와 같은 위험한 명령을 사용할 때는 분명히 조심하고 많이 테스트하십시오 kill.


1

몇 가지 옵션이 있습니다.

  • init-script (예 :에 배치 할 스크립트 /etc/init.d/)를 작성하고 있고 Debian 기반 배포판을 사용하는 경우 다음을 사용하는 것이 좋습니다 start-stop-daemon.
    # start-stop-daemon -T -p $PIDFILE -u $USER_NAME -n $NAME
    실행중인 경우 종료 코드 0을 가져와야합니다.
  • procps패키지 에서 pgrep 및 pkill을 사용할 수 있습니다 .
    pgrep --pidfile $PIDFILE

0

pid 파일이 있으면 pgrep을 사용하여 프로세스가 실행 중인지 확인할 수 있습니다.

    if pgrep -F something.pid; then
        echo "Running"
    else
        echo "Not running"
    fi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.