“优雅地”终止 bash 进程

“优雅地”终止 bash 进程

我试图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)
}

另外,这个函数有什么更好的名字吗?当前的名字让我想起了“Killing Me Softly”,manslaughter听起来有点严肃。也许吧spoon_kill(谷歌一下)?

答案1

您的 soft_kill 有几个问题。

  • 终止进程不是立即发生的,但信号发出后 kill 会立即退出。您必须等待一段时间才能确定 kill 命令是否成功,或者是否需要升级到 -INT 或 -HUP。
  • 杀死返回(1)如果允许发送信号,则为零(成功)。如果成功终止进程,则不为零。因此,在您的代码中,只会执行第一个终止操作。

(1)

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

艾因瓦尔
sig 的值是无效或不受支持的信号号。

增强型PERM
发送进程的用户 ID 没有特权;其实际或有效用户 ID 与接收进程的实际或保存的用户 ID 不匹配。或者,该进程没有权限将信号发送给任何接收进程。

胚胎干细胞研究
找不到与 pid 指定的进程或进程组相对应的进程或进程组。

答案2

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
}

相关内容