0

私は、CRONを介してXMLファイルのデルタインポートをトリガーするために使用できるbashスクリプトを求めています。少し掘り下げて修正した後、私はこれを持っています:

#!/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分ごとにこれを実行するつもりですか?それは合理的なようです。

唯一の主要な問題(IMHO)は、。を使用してSTDERR情報を破棄すること2>/dev/nullです。もちろん、それはこのシステムに対するあなたの期待に依存します。これが有料の顧客または雇用主向けである場合、上司に説明する必要がありますか?「まあ、STDERRをリダイレクトするため、過去3か月間エラーメッセージ「ホストXに接続できません」が表示されていることを知りませんでした。 / 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}

STDERR出力に含まれるcurlによっては、StdErrLogにあるものをフィルタリングして、送信する必要のある「実際の」エラーメッセージがあるかどうかを確認する必要がある場合があります。

中程度のクイズは、コマンド置換にバックティックを使用することです。評価にdbl-sqr-bracketsを使用している場合は、完全なksh93/bashセマンティクスを採用してみませんか。バックティックを使用する唯一の理由は、超下位互換性が必要であり、このスクリプトをBourneシェル(またはダッシュなどの削除されたシェルの1つ)で実行する場合です。バックティックはkshで非推奨になりました。少なくとも1993年以来。試してみてください

status=$(fgrep idle $outputDir/check_status_update_index.txt) 

コマンド置換の$( ... )形式により、複数のcmd-subtitutionsをネストすることが非常に簡単になり 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。それは、1行でそれ自体がノーオペレーションになるということです。フォーマットの問題だと思いましたが、編集モードでコードを見ると、それが独自の行にあるように見えます。STDERRメッセージを本当に破棄したい場合は、cmd ... 2>/dev/nullすべてを1行にする必要があります。または、alinsoarの提唱者として、シェルは行の先頭でリダイレクトを受け入れますが、ここでもすべて1行です;-!。

IHTH

于 2012-11-17T22:32:45.450 に答える