programing

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

magicmemo 2023. 4. 11. 21:55
반응형

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

bash 스크립트에서 다음 작업을 수행합니다(의사 코드).

if [ a process exists with $PID ]; then

    kill $PID 

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프로세스가 실행 중이고 프로세스를 종료할 권한이 없는 경우에도 종료 코드가 0이 아닙니다.예를 들어 다음과 같습니다.

kill -0 $known_running_pid

그리고.

kill -0 $non_running_pid

는 일반 사용자가 구별할 수 없는0 이외의 종료 코드를 가지고 있습니다만, 그 중 하나는 가정에 의한 실행이며, 다른 하나는 그렇지 않습니다.


일부 관련, AnrDaemon에 의해 제공되는 추가 정보:init 프로세스(PID 1)는 모든 Linux 머신에서 실행되고 있지만 모든 POSIX 시스템이 Linux인 것은 아닙니다.PID 1의 존재는 보증되지 않습니다.

kill -0 1 
-bash: kill: (1) - No such process … 

논의

만약 실험의 몸이 "죽음"이라면 살인과 인종 조건에 대해 논의하는 답은 정확히 옳다.일반적인 "bash에서 PID 존재 테스트 방법"을 찾으러 왔습니다.

/proc방법은 흥미롭지만, 어떤 의미에서는 의 정신을 깨뜨린다.ps명령어 추상화. 즉, 검색하러 갈 필요가 없습니다./proc라이너스가 전화하기로 결정하면exe다른 파일도 있나요?

공정이 존재하는지 확인하려면

kill -0 $pid

그러나 @unwind가 말했듯이 어떤 경우에도 종료하고 싶다면

kill $pid

그렇지 않으면 레이스 상태가 됩니다.처음부터 프로세스가 없어졌을 가능성이 있습니다.kill -0.

텍스트 출력을 무시하는 경우kill종료 코드에 기반한 작업을 하면 됩니다.

if ! kill $pid > /dev/null 2>&1; then
    echo "Could not send SIGTERM to process $pid" >&2
fi

Linux 등의 procfs 인터페이스를 구현하는 시스템에서는/proc/$PID존재:

if test -d /proc/"$PID"/; then
    echo "process exists"
fi

그렇지 않으면ps프로그램:

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그리고.grep두 번째 열에 있는 PID에 대해 지정합니다.이 예에서는,firefoxPID의 경우:

[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 $pidpid )) )) )) ))) )) )) ))) )) ))))

예를 들어 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

아이디 없이 앱 이름만 표시됩니다.

pid 기준:

pgrep [pid] >/dev/null

이름별:

pgrep -u [user] -x [name] >/dev/null

"-x"는 "일치 일치"를 의미합니다.

여기에서는 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가 존재하지만 다른 응용 프로그램에서 사용되는 경우 '예상치 못한 결과'가 발생할 수 있습니다.

저는 여기서 @FDS의 답변을 배우고 업그레이드했습니다.왜냐하면 그것은 훌륭하고 정확하기 때문입니다.하지만, 여기 제가 더 쉽게 읽고 이해할 수 있는 서식이 있습니다.

다음은 제가 선호하는 버전입니다.

설명:

  1. "$?"는 "명령어로부터의 코드 코드"를 의미합니다.part는 "이전 명령어로부터의 종료 코드 또는 코드"를 의미합니다.
  2. ps --pid "$pid" 코드 "Code"를 합니다.0PID(「PID」)의 경우"$pid".실행하고 있지 않은 을 사용하다실행하고 있지 않은 경우는 다른 번호도 있습니다.
  3. > /dev/null은 모두 됩니다.stdout보기 싫으니까.은 출구 코드 코드)입니다."$?"에서 참조해 주세요.ps --pid "$pid"명령어를 사용하여 해당 PID가 실행 중인지 여부를 확인합니다.더 으로 말하면, '하다'를 사용해요.> /dev/nullstdout의 출력/dev/null모든 착신 입력을 폐기하는 것을 목적으로 하는 의사 파일.
pid=1234
ps --pid "$pid" > /dev/null
if [ "$?" -eq 0 ]; then
    echo "PID $pid exists and is running."
fi

.shellcheck path/to/this_script.sh용장성을 피하기 위해서는 실제로는 반대로(@FDS에 나타나듯이) 해야 한다고 합니다.「 」를 .shellcheck을 사용하다

eRCaGuy_hello_world/bash$ shellcheck check_if_pid_exists.sh 

In check_if_pid_exists.sh line 46:
if [ "$?" -eq 0 ]; then
     ^--^ SC2181: Check exit code directly with e.g. 'if mycmd;', not indirectly with $?.

For more information:
  https://www.shellcheck.net/wiki/SC2181 -- Check exit code directly with e.g...

특히 이 부분에 주의해 주십시오.

SC2181: 종료 코드를 직접 확인합니다.if mycmd; '간접적으로'로요$?.

이 에러 코드의 상세한 것에 대하여는, https://github.com/koalaman/shellcheck/wiki/SC2181 를 참조해 주세요.

so,는,shellcheck츠키다

pid=1234
if ps --pid "$pid" > /dev/null; then
    echo "PID $pid exists and is running."
fi

그런 식으로 하는 것에 적응하고 싶다면 그렇게 하세요.처럼 제 을 읽고 제이 더 , 으로 그 '', '', '아까', '아까', '아까', '아까', '아까', '아까', '아까', '아까', '아까', '아까', '아까', '아까', '아까', '아까', '아까', '아까'를shellcheck, ", "를 # shellcheck disable=SC2181

최종적이고 바람직한 답변

ps --pid "$pid" >/dev/null
# shellcheck disable=SC2181
if [ "$?" -eq 0 ]; then
    echo "PID $pid exists and is running."
else
    echo "PID $pid does NOT exist."
fi

단,ps 여기서 중요한 것은 체크되는 명령어(이 경우)와 에러 코드를 체크하는 사이에 명령어(또는 스테이트먼트도 포함)삽입하지 않는 것입니다.그렇지 않으면 에러 코드를 체크하면 삽입된 명령어 스테이트먼트 등 최신 명령어로부터의 에러 코드가 잘못 체크됩니다. (우리의 경우)ps 관심의 명령에서가 아니라!

이 주된 입니다.shellcheck에서는, 올바른 커맨드의 에러 코드를 체크하고 있는 것을 확인합니다.

그것 말고는, 그것은 단지 어떻게 확인해야 하는지에 대한 C의 주장과 동등한 현학적인 의견 기반 토론일 뿐이다.NULL 값: (커넥터 포인터:

// The way preferred by pedantic people who don't want to "be redundant" with 
// an "unnecessary" `== NULL` check:
if (!some_ptr)
{
    printf("ERROR: null ptr.\n");
    return;
}

// Versus the more-readable and understandable way which I prefer to use
// whenever my peers will approve it without a fight or long argument
if (some_ptr == NULL)       // in C
// if (some_ptr == nullptr) // in C++
{
    printf("ERROR: null ptr.\n");
    return;
}

// Note: I just want to get my code merged and move on with life, so if they
// won't easily approve my preferred version above, I'll switch to the other,
// more-pedantic version of code to try to get a quick approval so I can be
// more productive. 
// There are few things more discouraging than being blocked over
// silly "pedantry" when your code is correct, bug-free, well-written, and does
// what it says it does.

어떤 할 수 있습니다.NULLC의 값(null ptrs)은 순전히 취향의 문제이며, bash에서는 오류 코드/반환 코드를 확인하는 방법도 순전히 취향의 문제입니다.현시점에서는, 「My final and preferred answer」라고 마크한 상기 버전을 선호합니다.

어쨌든, 여기 완전하고 실행 가능한 프로그램이 있습니다.

체크_if_pid_displays.sh eRCaGuy_hello_world repo:

#!/usr/bin/env bash

pid=1234

if [ "$#" -gt 0 ]; then
    # At least 1 argument was passed in, so assume it is the PID
    pid="$1"
fi

# Try to print the process (`ps`) information for this PID. Send it to
# /dev/null, however, so we don't actually have to look at it. We just want
# the return code, `$?`, which will be 0 if the process exists and some other
# number if not.
ps --pid "$pid" > /dev/null
# shellcheck disable=SC2181
if [ "$?" -eq 0 ]; then
    echo "PID $pid exists and is running."
else
    echo "PID $pid does NOT exist."
fi

실행 호출 및 출력 예시:

eRCaGuy_hello_world/bash$ ./check_if_pid_exists.sh 28876
PID 28876 exists and is running.

eRCaGuy_hello_world/bash$ ./check_if_pid_exists.sh
PID 1234 does NOT exist.

eRCaGuy_hello_world/bash$ ./check_if_pid_exists.sh 5678
PID 5678 does NOT exist.

한 PID PID(프로세스 ID)를 실행합니다.ps aux【PID】【PID】【PID】【PID】

관련된

  1. 몇 개의 서브프로세스가 종료될 때까지 bash에서 대기하고, 어떤 서브프로세스가 코드!=0으로 종료되었을 때 종료 코드!=0을 반환하는 방법에 대한 답변입니다.

언급URL : https://stackoverflow.com/questions/3043978/how-to-check-if-a-process-id-pid-exists

반응형