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

기본적으로 ‘0’은 어떤 신호를 나타내며, 여기서 1부터 시작하는 신호 번호가 표시 되기 때문 입니다.



답변

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.
...


답변

이것은 좋은 질문입니다 …

…이 특별한 신호에 대한 문서를 찾기가 어려울 수 있습니다. 다른 사람들의 말에도 불구하고 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: $?"


답변

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


답변

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

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

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

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


답변

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


답변