Mata los procesos bash "muy bien"

Mata los procesos bash "muy bien"

Estoy tratando de evitar kill -9por las razones descritas en elUso inútil de la carta modelo Kill -9. ¿Es esta función suficiente o necesito finalizar los killprocesos después de un tiempo de espera o ocuparme de otras 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)
}

Aparte, ¿cuál es un mejor nombre para esta función? El nombre actual me recuerda a "Killing Me Softly" y manslaughtersuena un poco severo. ¿Quizás spoon_kill(googlearlo)?

Respuesta1

Tu soft_kill tiene algunos problemas.

  • Matar un proceso no es instantáneo, pero matar sale tan pronto como se envía la señal. Tendrás que esperar un rato antes de determinar si el comando de eliminación tiene éxito o si necesitas escalar a -INT o -HUP.
  • matar regresa(1)cero (éxito) si se le permite enviar la señal. No si logra matar el proceso. Entonces, en su código solo se ejecutará la primera eliminación.

(1)

matar()
VALORES DE DEVOLUCIÓN
Si tiene éxito, kill() devuelve un valor de cero. En caso de error, devuelve un valor de -1, no envía una señal y establece errno en uno de los siguientes valores:

EINVAL
El valor de sig es un número de señal no válido o no compatible.

EPERM
El ID de usuario del proceso de envío no tiene privilegios; su ID de usuario real o efectivo no coincide con el ID de usuario real o guardado del proceso de recepción. O el proceso no tiene permiso para enviar la señal a ningún proceso receptor.

ESCRCH
No se puede encontrar ningún proceso o grupo de procesos que corresponda al que especifica pid.

Respuesta2

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
}

información relacionada