我真的很陌生,我厌倦了编写一个检查数据库连接是否存在的脚本。我计划创建一个作业来检查特定时间间隔的数据库连接并发送警报邮件
这是我写累了的代码,请指正或建议:
echo "exit" | sqlplus -L uid/pwd@dbname | grep Connected > /dev/null
if [ $? -eq 0 ]
then
mailx -s "DB connection error" maild_id
else
mailx -s "DB connection successful" maild_id
fi
你的脚本看起来不错,但存在逻辑缺陷。 与几乎所有命令一样,grep
在成功时将返回退出代码 0。 当 sqlplus 输出"已连接"时,grep "Connected"
将成功。 因此,您的脚本应如下所示:
echo "exit" | sqlplus -L uid/pwd@dbname | grep Connected > /dev/null
if [ $? -eq 0 ]
then
mailx -s "DB connection successful" maild_id
else
mailx -s "DB connection error" maild_id
fi
以下是您可以进行的一些改进:
- sqlplus 将在 stdin 上没有更多输入时退出。 因此,"回声"退出"是不必要的。
- 如果使用
-q
(quiet) 参数,则可以避免将grep
重定向到/dev/null
。grep
将只返回 0 或 1 退出代码,指示它找到了字符串。 - 您可能会发现 sqlplus 在成功连接时返回 0 退出代码。 您可能不必查找字符串"已连接"。
- 您可以将 sqlplus 命令作为
if
条件执行。
把所有这些放在一起:
if
>/dev/null sqlplus -L uid/pwd@dbname
then
mailx -s "DB connection successful" maild_id
else
mailx -s "DB connection error" maild_id
fi
但是,如果我对 sqlplus 退出代码有误,您仍然可以像这样编写脚本:
if
echo "exit" | sqlplus -L uid/pwd@dbname | grep -q Connected
then
mailx -s "DB connection successful" maild_id
else
mailx -s "DB connection error" maild_id
fi
你也可以通过使用&&
共轭来完全避免 if ; then ; else ; fi 构造。&&
是一个逻辑 AND 运算符 - 如果左表达式为真,它只会计算正确的表达式(它使用短路布尔逻辑)。 使用这个概念和关于 sqlplus 的假设,我们可以更紧凑地(但可能不太清晰)重写您的代码,如下所示:
STATUS="error"
>/dev/null sqlplus -L uid/pwd@dbname && STATUS="successful"
mailx -s "DB connection $STATUS" maild_id