我正在编写用于启动/停止一组服务的脚本。要停止,它必须终止许多需要一段时间且可能会挂起的进程。
该脚本需要验证进程确实已终止,如果在给定时间段后没有发生这种情况,则发送电子邮件。
这就是我所拥有的:
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
这样做的好处是可以轻松允许许多断言,并且当不需要采取任何行动(如发送电子邮件)时,断言可以最后执行,并且脚本退出状态将反映断言结果。