コマンド解説

最近、今更ながらにawsで遊んでいる(っ´∀`)っ ゃーですこんにちは。Amazon EC2のAPIを手持ちのノートPCにインストールして遊んでいます。WEBブラウザから簡単にインスタンスを作ったり消したり機動停止できたりするawsですが、シェル芸人としてはコマンドラインで操作したいところ。以下の環境で ec2-api-tools をインストールしたときのメモを残します。

■ OS CentOS release 6.3 (Final)
■ Java java-1.6.0-openjdk-1.6.0.0-1.50.1.11.5.el6_3.x86_64
(OSインストール時にbaseリポジトリからインストール)

…続きを読む

最近、今更ながらにawsで遊んでいる (っ´∀`)っ ゃーですこんにちは。Amazon EC2のAPIを手持ちのノートPCにインストールして遊んでいます。こちらのインストール方法については別途投稿しますが、パッケージのアップデートを監視するほうに夢中になって、EC2-API-TOOLSの更新通知スクリプトなんぞ書いてしまいました。

特徴ですが、変数「FILENAME」にファイル名を、変数「URI」にダウンロード元URI(監視対象)を、変数「MAILTO」にメール通知先を指定してあげるだけです。2回以上このスクリプトをキックすると、最大2世代のファイルを持つことになり、md5値のdiffが異なっていたらメール通知するというものです。ソースは以下の通りです。

 

#!/bin/bash
LANG=C
FILENAME=ec2-api-tools.zip                             # 監視対象ファイル名(ローカル)
URI=http://s3.amazonaws.com/ec2-downloads/${FILENAME}  # 監視対象URI
MAILTO=root@example.com                                # メール通知先
TMPDIR=${HOME}/tmp                                     # md5sumテキスト一時保存先
SRCDIR=${HOME}/src                                     # 監視対象ファイル格納先
OLDDIR=${SRCDIR}/old                                   # 古い監視対象ファイル格納先
NEWFILE=${SRCDIR}/${FILENAME}                          # 新しいファイルのフルパス
OLDFILE=${OLDDIR}/${FILENAME}                          # 古いファイルのフルパス
NEWMD5=${TMPDIR}/$(basename $0)_NEWFILEMD5             # 新しいファイルのmd5値を書き込むファイル
OLDMD5=${TMPDIR}/$(basename $0)_OLDFILEMD5             # 古いファイルのmd5値を書き込むファイル

################################################################################
_WGETCHK_() {
    [ ! 0 = $(which wget > /dev/null 2>&1 ; echo $?) ] && 
    echo "wget command is not found" | 
    mail -s "[FAIL] $(date +%Y/%m/%d) $(basename $0) check" ${MAILTO} && exit 1
}

_MD5CHK_() {
    [ ! 0 = $(which md5sum > /dev/null 2>&1 ; echo $?) ] && 
    echo "md5sum command is not found" | 
    mail -s "[FAIL] $(date +%Y/%m/%d) $(basename $0) check" ${MAILTO} && exit 1
}

_MAILCHK_() {
    [ ! 0 = $(which mail > /dev/null 2>&1 ; echo $?) ] && 
    echo "mail command is not found" && exit 1
}

_DIRCHK_() {
    [ ! -d ${OLDDIR} ] && mkdir -p ${OLDDIR}
    [ ! -d ${TMPDIR} ] && mkdir -p ${TMPDIR}
}

_DOWNLOAD_() {
    wget -O ${NEWFILE} ${URI}
}

_NOTIFY_() {
    echo "${FILENAME} is updated" | 
    mail -s "[EC2] $(date +%Y/%m/%d) $(basename $0) check" ${MAILTO}
}
################################################################################

## CHECK COMMANDS and CHECK DIR
_WGETCHK_
_MD5CHK_
_MAILCHK_
_DIRCHK_

## FILE MOVE && DOWNLOAD
[ -f ${NEWFILE} -a ! -f ${OLDFILE} ] && 
mv ${NEWFILE} ${OLDFILE} && _DOWNLOAD_

## FILE DOWNLOAD
[ ! -f ${OLDFILE} -a ! -f ${NEWFILE} ] && _DOWNLOAD_

## OLDFILE md5sum check
[ ! -f ${OLDFILE} ] &&  
md5sum ${OLDFILE} | awk '{print $1}' > ${OLDMD5}

## NEWFILE md5sum check
[ ! -f ${NEWFILE} ] &&  
md5sum ${NEWFILE} | awk '{print $1}' > ${NEWMD5}

## DIFF FILES check
[ ! -f ${OLDMD5} -o ! -f ${NEWMD5} ] && 
echo "MD5 DIFF is FAILED" | 
mail -s "[FAIL] $(date +%Y/%m/%d) $(basename $0) check" ${MAILTO} && exit 1

## DIFF and NOTIFY
[ ! 0 = $(diff ${OLDMD5} ${NEWMD5} > /dev/null 2>&1 ; echo $?) ] && _NOTIFY_

rm -f ${OLDMD5} ${NEWMD5}

いくつかコマンドラインの存在をチェックしてますが、wgetコマンドはCentOS6.3の最小構成インストールではインストールされないのでチェックするようにしています。ifの条件判定を「 -x 」にしても良かったかもですね。mailコマンドの存在確認は、mailxのパッケージがインストールされていないとそもそもメール通知できないので、標準出力にエラーを吐くようにしています。なので、このスクリプトを実行するときは、いきなりメールを確認しようとせずに、ちゃんとターミナルで確認してくださいね(´・ω・`)

さっきのエントリで、for文使ったりパイプに渡すような書き方しちゃったけど、

早速 @chonan さんから ツッコミ が・・・(;゚Д゚)

$ date --date="`date +%d` days ago" +%Y%m01
20110201
$ date --date="`date +%d` days ago" +%Y%m%d
20110228
$ date --date="`date +%d` days ago" +%Y/%m/01
2011/02/01
$ date --date="`date +%d` days ago" +%Y/%m/%d
2011/02/28
えらくシンプルにできました(;゚Д゚) タッタコレダケ
ゼロパディングの影響を極力排除したいなら
$ date --date="`date +%e` days ago" +%Y/%m/%d
2011/02/28
とか
$ date --date="`date +%-d` days ago" +%Y/%m/%d
2011/02/28
らしいけど、まだまだ精進しなきゃです。。。 (´・ω・`)
@chonanさん、有難うございます。

2017/12/31 03:30 追記

この投稿の方法で前月の今日、みたいな日付の求め方をしてしまうと、31日まである月や2月のように、正確でない日付が出力されてしまいます。GNU dateでもっと確実に前月を表示する方法は以下の投稿に書きました。


あるシェルスクリプトで先月分のログを抽出しているのですが、毎回毎回 YYYYMMDDと引数を入れるのがかったるい。できればこういう処理は自動化できれば作業品質も上がるだろうということで、1行でやってみました。

…続きを読む