我正在寻找一个bash脚本,可以使用该脚本通过CRON触发XML文件的delta导入。经过一点挖掘和修改,我有了这个:
#!/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
我能得到任何反馈吗?有更好的方法吗?任何优化或改进都将是最受欢迎的。
这看起来确实有用。只是为了确认一下,你打算在你的crontab上运行X分钟吗?这似乎是合理的。
唯一的主要争论(IMHO)是丢弃具有2>/dev/null
的STDERR信息。当然,这取决于你对这个系统的期望。如果这是针对付费客户或雇主的,你想向老板解释吗?"天哪,我不知道在过去的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括号进行求值,那么为什么不采用完整的ksh93/bash语义呢。使用backticks的唯一原因是,如果你认为你需要超级向后兼容,并且你将在bourne shell(或者可能是像dash这样的精简shell)下运行这个脚本。至少从1993年起,backticks就在ksh中被弃用了。尝试
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
就是你的选择。
编辑
我同意@alinsor的观点,即线路上的2>/dev/null
本身将是一个no-op。我认为这是一个格式问题,但在编辑模式下查看您的代码时,我发现它似乎在自己的行上。如果你真的想丢弃STDERR消息,那么你需要cmd ... 2>/dev/null
全部在一行上,或者正如alinsoar所提倡的,shell将在这行的前面接受重定向,但同样,所有重定向都在一行;-!。
IHTH