我正在寻找一个 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
我可以获得对此的任何反馈吗?有更好的方法吗?任何优化或改进都将受到欢迎。
这看起来确实有用。只是为了确认一下,您打算从 crontab 运行 X 分钟吗?看起来很有道理。
唯一的主要问题(恕我直言)是用
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" [email protected] < ${myStdErrLog}
fi
rm ${myStdErrLog}
根据curl在其STDERR输出中包含的内容,您可能需要过滤StdErrLog中的内容,以查看是否有需要发送给您的“真实”错误消息。
一个中等的狡辩是你使用反引号进行命令替换,如果你使用 dbl-sqr-brackets 进行评估,那么为什么不接受完整的 ksh93/bash 语义。使用反引号的唯一原因是,如果您认为需要超向后兼容,并且您将在 bourne shell(或者可能是破折号等精简 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 将在行的前面接受重定向,但同样,全部在一行上。