프로세스 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에 대해 지정합니다.이 예에서는,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"를 사용하십시오.
나는 그것이 인종 상황에 개방되는 나쁜 해결책이라고 생각한다.테스트와 살인 요청 사이에 프로세스가 중단되면 어떻게 하죠?그럼 살인은 실패할 거야그럼 왜 모든 사건에서 살인을 시도하지 않는 거죠? 그리고 어떻게 된 건지 알기 위해 그 결과를 확인해보죠?
네가 원하는 것 같아
wait $PID
$pid
료됩니니다다
그렇지 않으면
ps -p $PID
되어 있는지 이 더 입니다).kill -0 $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
아이디 없이 앱 이름만 표시됩니다.
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의 답변을 배우고 업그레이드했습니다.왜냐하면 그것은 훌륭하고 정확하기 때문입니다.하지만, 여기 제가 더 쉽게 읽고 이해할 수 있는 서식이 있습니다.
다음은 제가 선호하는 버전입니다.
설명:
"$?"
는 "명령어로부터의 코드 코드"를 의미합니다.part는 "이전 명령어로부터의 종료 코드 또는 코드"를 의미합니다.ps --pid "$pid"
코드 "Code"를 합니다.0
PID(「PID」)의 경우"$pid"
.실행하고 있지 않은 을 사용하다실행하고 있지 않은 경우는 다른 번호도 있습니다.> /dev/null
은 모두 됩니다.stdout
보기 싫으니까.은 출구 코드 코드)입니다."$?"
에서 참조해 주세요.ps --pid "$pid"
명령어를 사용하여 해당 PID가 실행 중인지 여부를 확인합니다.더 으로 말하면, '하다'를 사용해요.> /dev/null
stdout
의 출력/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.
어떤 할 수 있습니다.NULL
C의 값(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】
관련된
- 몇 개의 서브프로세스가 종료될 때까지 bash에서 대기하고, 어떤 서브프로세스가 코드!=0으로 종료되었을 때 종료 코드!=0을 반환하는 방법에 대한 답변입니다.
언급URL : https://stackoverflow.com/questions/3043978/how-to-check-if-a-process-id-pid-exists
'programing' 카테고리의 다른 글
PowerShell에서 두 개의 텍스트 파일을 연결하는 방법은 무엇입니까? (0) | 2023.04.11 |
---|---|
로컬 브런치가 추적하고 있는 리모트브런치를 특정합니다. (0) | 2023.04.11 |
SQL Server에서 GETDATE()를 밀리초 단위로 인쇄하려면 어떻게 해야 합니까? (0) | 2023.04.11 |
Excel 시트에서 정확히 지정된 범위를 판독하는 Python Panda 데이터 프레임 (0) | 2023.04.11 |
예약된 단어를 속성 이름으로 사용, 다시 방문 (0) | 2023.04.06 |