
Estou tentando evitar kill -9
pelos motivos descritos noUso inútil da carta modelo Kill -9. Esta função é suficiente ou preciso encerrar os kill
processos 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)
}
Além disso, 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
(pesquise no Google)?
Responder1
Seu soft_kill tem alguns problemas.
- matar um processo não é instantâneo, mas kill sai assim que o sinal é enviado. Você terá que esperar um pouco antes de determinar se o comando kill foi bem-sucedido ou se você precisa escalar para -INT ou -HUP.
- matar retorna(1)zero (sucesso) se for permitido enviar o sinal. Não se conseguir matar o processo. Portanto, no seu código, apenas o primeiro kill será executado.
(1)
matar()
VALORES DE RETORNO
Se for bem-sucedido, kill() retornará um valor zero. Em caso de falha, ele retorna um valor de -1, não envia um sinal e define errno para um dos seguintes valores:
EINVAL
O valor de sig é um número de sinal inválido ou não suportado.
EPERMA
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 de usuário real ou salvo do processo de recebimento. Ou o processo não tem permissão para enviar o sinal para nenhum processo receptor.
ESCRH
Nenhum processo ou grupo de processos pode ser encontrado que corresponda àquele especificado pelo pid.
Responder2
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
}