bash 프로세스를 "좋게" 종료합니다.

bash 프로세스를 "좋게" 종료합니다.

나는 kill -9다음에 설명된 이유로 피하려고 노력하고 있습니다.Kill -9 양식 편지의 쓸모없는 사용. 이 기능이 충분합니까, 아니면 kill시간 초과 후 프로세스를 종료하거나 다른 미묘한 부분을 처리 해야 합니까 ?

soft_kill()
{
    # Try to avoid forcing a kill
    # @param $1: PID
    kill $1 || kill -INT $1 || kill -HUP $1 || \
    (echo "Could not kill $1" >&2; kill -KILL $1)
}

여담인데, 이 함수의 더 좋은 이름은 무엇인가요? 지금의 이름은 "Killing Me Softly"를 생각나게 하고, manslaughter다소 엄숙하게 들립니다. 어쩌면 spoon_kill(구글에서)?

답변1

Soft_kill에 몇 가지 문제가 있습니다.

  • 프로세스 종료는 즉시 발생하지 않지만 신호가 전송되자마자 종료됩니다. kill 명령이 성공했는지 또는 -INT 또는 -HUP로 에스컬레이션해야 하는지 결정하기 전에 잠시 기다려야 합니다.
  • 킬 리턴(1)신호 전송이 허용되면 0(성공)입니다. 프로세스를 종료하는 데 성공한 경우에는 그렇지 않습니다. 따라서 코드에서는 첫 번째 킬만 실행됩니다.

(1)

죽이다()
반환 값
성공하면 kill()은 0 값을 반환합니다. 실패하면 -1 값을 반환하고 신호를 보내지 않으며 errno를 다음 값 중 하나로 설정합니다.

EINVAL
sig 값이 유효하지 않거나 지원되지 않는 신호 번호입니다.

EPERM
전송 프로세스의 사용자 ID에는 권한이 없습니다. 실제 또는 유효 사용자 ID가 수신 프로세스의 실제 또는 저장된 사용자 ID와 일치하지 않습니다. 또는 프로세스에 신호를 수신 프로세스로 보낼 권한이 없습니다.

ESRCH
pid가 지정하는 프로세스 또는 프로세스 그룹을 찾을 수 없습니다.

답변2

terminate () {
    # accepts PID as $1, defaults to current process
    local signals=(TERM INT QUIT HUP KILL) s=0 process=${1:-$$}
    local signal_qty=${#signals[@]}

    while pgrep $process >/dev/null
    do
        signal=${signals[s]}
        [[ $signal = KILL ]] && echo "Attempting to force kill it." >&2
        kill -$signal $process
        (( ++s >= signal_qty )) && { echo "It won't die." >&2; return 1; }
        sleep 1
    done
}

관련 정보