Mate os processos bash "bem"

4

Estou tentando evitar o kill -9 pelos motivos descritos no Uso inútil da letra de forma Kill -9 . Essa função é suficiente ou preciso matar os processos kill após um tempo limite ou cuidar de outras sutilezas?

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)
}

Como um aparte, qual o melhor nome para esta função? O nome atual me lembra "Killing Me Softly", e manslaughter soa um pouco severo. Talvez spoon_kill (Google)?

    
por l0b0 15.12.2010 / 12:33

2 respostas

3

Seu soft_kill tem alguns problemas.

  • matar um processo não é instantâneo, mas matar saídas assim que o sinal é enviado. Você terá que esperar um pouco antes de determinar se o comando kill foi bem-sucedido ou se é necessário escalonar para -INT ou -HUP.
  • kill retorna (1) zero (sucesso) se for permitido enviar o sinal. Não se conseguir matar o processo. Então, no seu código, apenas a primeira morte será executada.

(1)

kill ()
VALORES DE RETORNO
Se bem sucedido, kill () retorna um valor de zero. Na falha, ele retorna um valor de -1, não envia um sinal e configura errno para um dos seguintes valores:

EINVAL
O valor de sig é um número de sinal inválido ou não suportado.

EPERM
O ID do usuário do processo de envio não é privilegiado; seu ID de usuário real ou efetivo não corresponde ao ID do usuário real ou salvo do processo de recebimento. Ou, o processo não tem permissão para enviar o sinal para qualquer processo de recebimento.

ESRCH
Nenhum processo ou grupo de processos pode ser encontrado que corresponda ao que pid especifica.

    
por 15.12.2010 / 14:13
8
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
}
    
por 17.12.2010 / 20:32

Tags