4

Я пытаюсь избежать 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)
}

Кроме того, как лучше назвать эту функцию? Нынешнее название напоминает мне "Убей меня нежно", и manslaughter звучит немного сурово. Может быть, spoon_kill (Google это)?

2 ответа2

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

У вашего soft_kill есть несколько проблем.

  • уничтожение процесса не происходит мгновенно, но kill завершается сразу после отправки сигнала. Вам придется подождать некоторое время, прежде чем определить, успешно ли выполнена команда kill или вам нужно перейти в -INT или -HUP.
  • kill возвращает (1) ноль (успех), если разрешено отправлять сигнал. Нет, если удастся убить процесс. Таким образом, в вашем коде будет выполнено только первое уничтожение.

(1)

убийство()
ВОЗВРАЩАЕМЫЕ ЦЕННОСТИ
В случае успеха kill() возвращает значение ноль. При сбое он возвращает значение -1, не отправляет сигнал и устанавливает errno на одно из следующих значений:

EINVAL
Значение sig является недопустимым или неподдерживаемым номером сигнала.

EPERM
Идентификатор пользователя процесса отправки не является привилегированным; его действительный или эффективный идентификатор пользователя не соответствует действительному или сохраненному идентификатору пользователя в процессе получения. Или у процесса нет разрешения на отправку сигнала любому процессу получения.

ESRCH
Не может быть найдено ни одного процесса или группы процессов, соответствующих указанному в pid.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .