![“优雅地”终止 bash 进程](https://linux22.com/image/1259283/%E2%80%9C%E4%BC%98%E9%9B%85%E5%9C%B0%E2%80%9D%E7%BB%88%E6%AD%A2%20bash%20%E8%BF%9B%E7%A8%8B.png)
我试图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
}