프로세스가 실행 중인지 확인하는 데 자주 사용되는 관용구 중 하나는 를 사용하는 것입니다 kill -s 0 $pid
.
내 질문은 생성자를 사용하는 것보다 어떤 이점이 있습니까 [[ -e /proc/$pid ]]
?
제가 작성 중인 스크립트는 Linux 및 bash용입니다.
답변1
나는 전자가 이식 가능하고 POSIX에 의해 지정되기 때문에 kill -s 0 pid
테스트와 테스트를 선호합니다. 스크립트가 Linux를 대상으로 하더라도 어떤 이유로든 제거될 위험이 /proc/pid
(아주 약간) 있습니다 ./proc
답변2
kill
나는 보통 에서 직접 내용을 읽는 것과 같은 명령을 사용합니다 /proc
. 이점은 이와 같은 도구가 kill
성공이나 실패에 관계없이 상태 코드를 반환하고(생각해 보세요) 콘텐츠를 직접 스크롤하는 대신 콘텐츠를 처리하는 동안 이론적으로 API와 관련된 모든 것을 포함해야 한다는 것입니다.$?
/proc
또한 특수 명령을 사용하면 다양한 Unix에서 코드의 이식성을 높일 수 있습니다. /proc
Solaris 및 AIX와 같은 다른 UNIX에서는 일반적이지 않습니다.
예
테스트 프로세스가 종료됩니다.
$ sleep 10 &
[1] 11639
이제 우리는 그것을 죽인다.
$ kill 11639
[1]+ Terminated sleep 10
우리는 성공했나요?
$ echo $?
0
0은 우리가 성공했음을 의미합니다. 다른 것은 다르게 접근할 수 있습니다. 를 똑바로 읽어보면 /proc
우리는 딜레마에 빠지게 된다.
존재하지 않는 프로세스를 종료하려고 하는 것과 같은 상황입니다.
$ kill 61234
bash: kill: (61234) - No such process
우리는 이에 대한 피드백을 받습니다.
$ echo $?
1
또 뭐야?
pkill
대신 사용 및 이름으로 프로세스를 종료하거나 찾는 방법을 살펴볼 수도 있습니다. 그러나 그것은 궁극적으로 당신이 무엇을 하고 싶은지에 달려 있습니다.pgrep
$pid
답변3
kill -s 0 $pid
사이에는 큰 차이가 있습니다 [ -e /proc/$pid ]
. 후자는 해당 PID를 가진 프로세스(또는 좀비 프로세스)가 있는지 테스트합니다. 전자는 신호를 보낼 수 있는 프로세스(또는 좀비)에만 일치합니다. 즉, 프로세스의 실제 또는 저장된 UID는 프로세스를 실행 중인 셸의 UID와 동일해야 합니다(셸이 루트로 실행되지 않는 한, 어떤 경우에는 차이가 없습니다).
어떤 것을 사용할지는 다른 사용자의 프로세스를 일치시키려는지 여부에 따라 다릅니다.
kill -s 0 $pid
이식성이 매우 뛰어납니다(POSIX 호환). 테스트는 동일한 효과를 얻을 수 있는 이식 가능한 방법이 /proc/$pid
아니기 때문에 BSD unice에서는 작동하지 않습니다 ./proc
ps -p $pid >/dev/null 2>/dev/null