쉘 스크립트에서`kill -0 $ pid`는 무엇을 하는가?


답변:


136

0주어진 신호 를 전송하면 주어진 PID프로세스 PID가 실행 중인지 확인하고 신호를 보낼 수있는 권한이 있습니다.

자세한 내용은 다음 맨 페이지를 참조하십시오.

죽이기 (1)
$ man 1 kill
...
If sig is 0, then no signal is sent, but error checking is still performed.
...
죽이기 (2)
$ man 2 kill
...
If sig is 0, then no signal is sent, but error checking is still performed; this 
can be used to check for the existence of a process ID or process group ID.
...

7
이 정보의 위치 (있는 경우)는 시스템에 따라 크게 다릅니다. 최근 데비안 기반 시스템에서는 man 2 kill대신 사용하십시오.
Todd A. Jacobs

2
모두 man 1 killman 2 kill나의 페도라 20 시스템에 있었다. 그러나 두 매뉴얼 페이지에 묻혀있는 것은 찾기가 어렵습니다.
slm

또는 대신 posix 매뉴얼을 사용하십시오. If sig is 0 (the null signal), error checking is performed but no signal is actually sent. The null signal can be used to check the validity of pid. pubs.opengroup.org/onlinepubs/009695399/functions/kill.html
Thomas Hughes

2
나는 명령 man 2 kill이 1 차 수정안 밖 이라고 생각합니다 :)
JBaczuk

126

이것은 좋은 질문입니다 ...

...이 특별한 신호에 대한 문서를 찾기가 어려울 수 있습니다. 다른 사람들의 말에도 불구하고 man 1 kill데비안 기반 시스템 에서이 신호에 대한 유일한 언급은 다음과 같습니다 .

특히 유용한 신호는 HUP, INT, KILL, STOP, CONT 및 0을 포함합니다.

특히 신호가 무엇인지 모르는 경우 특히 도움이되지 않습니다. 또한의 출력에 의해 나열 kill -l되지 않으므로 이미 알고 있지 않으면 알 수 없습니다.

문서화 된 곳

데비안과 우분투 시스템에서 다음과 man 2 kill같이 말합니다.

sig가 0이면 신호가 전송되지 않지만 여전히 오류 점검이 수행됩니다. 프로세스 ID 또는 프로세스 그룹 ID가 있는지 확인하는 데 사용할 수 있습니다.

좋은 것

kill -0프로세스가 실행 중인지 확인할 수 있습니다 . 이러한 예를 고려하십시오.

# Kill the process if it exists and accepts signals from
# the current user.
sleep 60 &
pid=$!
kill -0 $pid && kill $pid

# Check if a PID exists. When missing, this should result
# in output similar to:
#    bash: kill: (6228) - No such process
#    Exit status: 1
kill -0 $pid; echo "Exit status: $?"

kill -0현재 사용자에게 주어진 프로세스를 알리는 권한이 있는지 확인하는 데 사용할 수도 있습니다 . 예를 들면 다음과 같습니다.

# See if you have permission to signal the process. If not,
# this should result in output similar to:
#     bash: kill: (15764) - Operation not permitted
#     Exit status: 1
sudo sleep 60 &
kill -0 $!; echo "Exit status: $?"

mac 및 BSD에서도 kill(2) 다음과 같은 내용을 볼 수 있습니다.The kill() function sends the signal specified by sig to pid, a process or a group of processes. Typically, Sig will be one of the signals specified in sigaction(2). A value of 0, however, will cause error checking to be performed (with no signal being sent). This can be used to check the validity of pid.
lukecampbell

8
이것이 정답입니다. 다른 것보다 훨씬 낫습니다. 신호 0에 대한 문서를 찾기가 어렵습니다. 그것은에 묻혀 kill매뉴얼 페이지 "SIG는 다음 신호가 전송되지 않습니다, 0이지만, 오류 검사는 여전히 실행됩니다."
slm

6

이 명령은 $ pid의 PID가있는 프로세스가 살아 있는지 확인합니다.


1
매뉴얼 페이지에 "sig가 0이면 신호가 전송되지 않지만 오류 검사는 여전히 수행됩니다." 여기서 어떤 오류 점검을하고 있습니까?
gjain 2016 년

2
-1, PID $pid가 있는 프로세스 가 실행 중일 수 있지만 신호를 보낼 수있는 권한이 없습니다.
dwalter

2
@dwalter : 권한이 없으면 EPERM을받습니다. 존재하지 않으면 ESRCH를 얻게됩니다. 는 kill(1)각각 다른 오류를 인쇄합니다. 따라서 신호 전송 권한이 있는지 여부에 관계없이 pid가 활성인지 여부를 알 수 있습니다. 또한 일반적인 사용법은 kill -0pid가 항상 올바르게 사용되지 않더라도 pid가 살아 있는지 확인하는 것입니다. 이 답변이 정확하다고 말하고 싶습니다 (맞춤법 제외).
camh

3
@ camh : kill -0 $pid두 경우 모두 의 반환 값이 동일 하지 않습니다 . 그것은 반환 1당신의 OUPUT 구문 분석하지 않고 말할 수 있도록 kill당신이 그것을에 신호를 보낼 수있는 권한이없는 경우 프로세스가 실행 중이거나하지 않은 경우입니다. 편집 : 예 나는 프로세스가 살아 있는지 확인하는 데 대부분의 시간이 사용되는 것을 알고 있지만 신호를 보낼 수있는 권한을 가지고 있지 않다면 (예 : 루트)
dwalter

2
@ dwalter : 내 요점은 정답입니다. 당신은 pedantic하려고하고 또 다른 오류 사례가 있다고 지적했지만, killbash 내장 (질문에 태그가 지정되어 있음 bash)이 stderr에 오류 유형을 표시하고 표시하기 때문에 기술적으로 답변이 해당 사례를 다루고 있다고 말하고 있습니다. 리턴 코드에 오류가 있습니다. 즉, 출력을 올바르게 해석하면 "이 명령은 PID가 $ pid 인 프로세스가 살아 있는지 여부를 확인합니다"가 완전히 올바른 것입니다. [당신이 대답에 -1을했다고 말하지 않았다면 언급하지 않았을 것입니다. 그렇지 않으면 귀하의 의견은 유효합니다].
camh

6

Kill -0 $ pid는 pid가있는 프로세스가 존재하는지 여부를 확인하는 것입니다.

'kill -0 $ pid'를 사용하여 프로세스 존재를 확인하는 동안주의하십시오.

  1. 원하는 프로세스가 종료되면 해당 pid는 새로 작성된 다른 프로세스에 할당 될 수 있습니다. (따라서 특정 프로세스가 살아 있는지 여부를 확신 할 수 없습니다)

  2. 좀비 프로세스의 경우, 부모가 대기하기를 기다리는 자녀가 있습니다. 여기에서 $ pid를 유지하고 해당 프로세스가 실행되고 있지 않은 동안 긍정적 인 결과를 제공합니다.


1

$ pid로 실행중인 프로세스가 활성 상태인지 여부를 확인하는 데 사용되는 -0 $ pid를 종료하십시오. 그러나 프로세스가 종료되고 새 프로세스가 실행되면 프로세스 ID를 다시 할당 할 수 있으므로 까다로울 수 있습니다. killall -0을 사용하여 특정 프로세스가 실행 중인지 여부를 알 수 있습니다.


0

EXIT신호를 보내 거나 0프로세스에 보내면 :

  1. 프로세스가 있는지 확인하십시오.
  2. 프로세스 (PID, PGID 등 ...)에서 다양한 오류 검사를 수행하십시오.
  3. stdout성공 하면 출력을 보내지 않습니다 .
  4. 잘못된 것이 stderr있으면 오류 메시지를 보내십시오 .
  5. 프로세스가 소진 된 경우 (예 : 좀비) 오 탐지를 제공합니다.

보다 명확하게 쉘 스크립트에 유용한 기능은 다음과 같습니다.

function isProcess ()
{
    kill -s EXIT $1 2> /dev/null
}

이것은 stdout성공하면 텍스트를 반환하지 않지만 stderr실패 하면 오류 메시지를 반환 하지만 오류 메시지를 (으 /dev/null)로 리디렉션했습니다 .

불량 / 좀비 프로세스 상태가 염려ps 되면 --no-headers스위치 와 함께 사용하는 것이 좋습니다 .

#!/bin/ksh

function trim ()
{
    echo -n "$1" | tr -d [:space:]
}

function getProcessStatus ()
{
    trim $(ps -p $1 -o stat --no-headers)
}

function isZombie ()
{
    typeset processStatus=$(getProcessStatus $1)

    [[ "$processStatus" == "Z" ]]
    return $?
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.