这当然看起来很有用。只是为了确认一下,你打算从你的 crontab 运行这个 X 分钟吗?这似乎很合理。
唯一的主要问题(恕我直言)是丢弃 STDERR 信息2>/dev/null
。当然,这取决于您对该系统的期望。如果这是针对付费客户或雇主的,您是否需要向老板解释,“天哪,我不知道过去 3 个月我收到错误消息‘无法连接到主机 X’,因为我们重定向了 STDERR到 /dev/null”!如果这是针对您自己的项目,并且您通过其他渠道监控工作,那么并不是那么糟糕,但为什么不将 STDERR 捕获到文件中,并检查是否没有错误。作为一个总体思路....
myStdErrLog=/tmp/myProject/myProg.stderr.$(/bin/date +%Y%m%d.%H%M)
wget -O $outputDir/check_status_update_index.txt ${statusCmd} 2> ${myStdErrLog}
if [[ ! -s ${myStdErrLog} ]] ; then
mail -s "error on myProg" me@myself.org < ${myStdErrLog}
fi
rm ${myStdErrLog}
根据 curl 在其 STDERR 输出中包含的内容,您可能需要过滤 StdErrLog 中的内容,以查看是否需要发送给您的“真实”错误消息。
一个中等问题是您使用反引号进行命令替换,如果您使用 dbl-sqr-brackets 进行评估,那么为什么不采用完整的 ksh93/bash 语义。使用反引号的唯一原因是,如果您认为您需要超向后兼容并且您将在 bourne shell(或者可能是像 dash 这样的精简 shell 之一)下运行此脚本。反引号在 ksh 中已被弃用至少从 1993 年开始。尝试
status=$(fgrep idle $outputDir/check_status_update_index.txt)
命令替换的$( ... )
形式使得嵌套多个 cmd 替换非常容易,即 echo $(echo one $(echo two ) )
. (不好的例子,因为需要嵌套 cmd-sub 非常罕见,我现在想不出更好的例子)。
根据您的情况,但在大型生产环境中,新软件安装到版本编号目录中,您可能希望从变量构建路径,即
hostName=localhost
portNum=8080
SOLRPATH=/solr
SOLRCMD='delta-import&clean=false"
urlCmd='http://${hostName}:${portNum}${SOLRPATH}/dataimport?command=${SOLRCMD}"
最后的小问题;-)。你确定${status} == *idle*
做你想做的事吗?
尝试使用类似的东西
case "${status}" in
*idle* ) .... ;;
* ) echo "unknown status = ${status} or similar" 1>&2 ;;
esac
是的,您if ... fi
当然可以,但是如果您想开始对放入${status}
变量中的信息进行更精细的处理,那么case ... esac
就是要走的路。
编辑
我同意@alinsoar 的观点,即单靠2>/dev/null
一行将是无操作的。我认为这是一个格式问题,但在编辑模式下查看您的代码,我发现它似乎在自己的行上。如果您真的想丢弃 STDERR 消息,那么您需要cmd ... 2>/dev/null
全部放在一行上,或者作为 alinsoar 的倡导者,shell 将在该行的前面接受重定向,但同样,全部放在一行上 ;-!。
IHTH