杀死 bash 进程“很好”

l0b*_*0b0 5 linux kill

kill -9由于无用使用 Kill -9 form letter 中描述的原因,我试图避免。这个功能是否足够,或者我是否需要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)
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,这个函数的更好的名字是什么?现在的名字让我想起了《温柔地杀了我》,manslaughter听起来有点严厉。也许spoon_kill(谷歌它)?

Den*_*son 9

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
}
Run Code Online (Sandbox Code Playgroud)


Nif*_*fle 3

您的 soft_kill 有一些问题。

  • 杀死进程不是瞬时的,但是一旦发送信号,kill就会退出。您必须等待一段时间才能确定kill命令是否成功或者是否需要升级到-INT或-HUP。
  • 如果允许发送信号,kill 将返回(1)零(成功)。如果成功终止进程则不会。所以在你的代码中只有第一个kill会被执行。

(1)

Kill()
返回值
如果成功,kill() 返回值为零。失败时,它返回值 -1,不发送信号,并将 errno 设置为以下值之一:

EINVAL
sig 的值是无效或不受支持的信号号。

EPERM
发送进程的用户ID没有特权;其真实或有效的用户ID与接收进程的真实或保存的用户ID不匹配。或者,该进程没有权限将信号发送到任何接收进程。

ESRCH
找不到与 pid 指定的进程或进程组相对应的进程或进程组。