0

我正在使用一个 bash 脚本,我可以使用它来通过 CRON 触发 XML 文件的增量导入。经过一些挖掘和修改后,我有这个:

#!/bin/bash
# Bash to initiate Solr Delta Import Handler

# Setup Variables
urlCmd='http://localhost:8080/solr/dataimport?command=delta-import&clean=false'
statusCmd='http://localhost:8080/solr/dataimport?command=status'
outputDir=. 

# Operations
wget -O $outputDir/check_status_update_index.txt ${statusCmd} 
2>/dev/null 
status=`fgrep idle $outputDir/check_status_update_index.txt` 
if [[ ${status} == *idle* ]] 
then 
wget -O $outputDir/status_update_index.txt ${urlCmd} 
2>/dev/null 
fi 

我可以得到任何反馈吗?有更好的方法吗?任何优化或改进都将受到欢迎。

4

1 回答 1

1

这当然看起来很有用。只是为了确认一下,你打算从你的 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

于 2012-11-17T22:32:45.450 回答