Bash:验证进程已停止

Bash:验证进程已停止

我正在编写用于启动/停止一组服务的脚本。要停止,它必须终止许多需要一段时间且可能会挂起的进程。

该脚本需要验证进程确实已终止,如果在给定时间段后没有发生这种情况,则发送电子邮件。

这就是我所拥有的:

pkill -f "stuff"

for i in {1..30}; do
    VERIFICATIONS=$i
    if verification_command then
        echo "It's gone"
        break
    fi
    sleep 2
done

if [ $VERIFICATIONS -ge 30 ]; then
   echo "failed to terminate"
   # send mail
fi

有一个更好的方法吗?

答案1

我不确定您希望改进哪一部分。至于终止,许多进程将其自己的 pid(=进程 ID)存储在目录 /var/run 中,存储在扩展名为 .pid 的文件中,该文件仅包含其 pid,不包含任何其他内容。

程序会使用此 pid 来终止自身(自杀?)。如果程序自行重新启动(这是无法终止程序的常见原因),则新 pid 将与旧 pid 不同。所有这些仅适用于服务,即您可以使用以下方式停止的程序

 sudo service sshd stop

(在 Debian 及其衍生产品中)。您也许可以考虑实施类似的机制。

答案2

找到了我认为最好的方法,基于napcae 的评论:使用函数。

assert_service_stopped () {
    for i in {1..30}; do
        if verification_command then
            echo "It's gone"
            return 0
        fi
        sleep 2
    done
    echo "It hangs dude!"
    return 1
}        

pkill -f "stuff"

if ! assert_service_stopped; then
    echo "failed to terminate"
    # send mail
fi

这样做的好处是可以轻松允许许多断言,并且当不需要采取任何行动(如发送电子邮件)时,断言可以最后执行,并且脚本退出状态将反映断言结果。

相关内容