启动 Solr deltaimporthandler 的 Bash 脚本

问题描述 投票:0回答:1

我正在寻找一个 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 

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

bash shell solr lucene cron
1个回答
1
投票

这看起来确实有用。只是为了确认一下,您打算从 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 将在行的前面接受重定向,但同样,全部在一行上。

© www.soinside.com 2019 - 2024. All rights reserved.