Linuxにおけるexpect機能について豆知識

Cloudサーバ上のDBバックアップを自動化したいという要望に対する処理で発見したこと。

【想定】
□potal.poweredge.co.jp側のシェル(cronでAM4:00/日 起動)
1.バックアップ必須のスキーマに対してDBDumpをしてdumpファイルを作成
2.上記ファイルをtarコマンドで圧縮
3.scpコマンドでstaff.poweredge.co.jpに転送
※scpコマンドはインタラクティブ(対話形式)なため、expectを利用する

□staff.poweredge.co.jp側シェル(cronで1分毎起動)
1.転送ディレクトリを監視
2.対象ファイルを見つけたら、tarコマンドで解凍
3.対象ファイルを共有フォルダ(/var/www/html/webdav/all/100.backup)に移動

上記の想定でcron設定したが、”なぜか”動作せず・・・(´・ω・`)?

【原因】
potal.poweredge.co.jpサーバ側のシェルがエラーになり実行時エラー
expectの実行時にエラーになることが判明。interact は cron ではダメらしい。
interact ですが、man を読むとこう書いてありました。

interact [string1 body1] … [stringn [bodyn]]
は、現プロセスの制御をユーザーに渡す。
結果、現プロセスに送られたキーストロークと現プロセスの標準出力と
標準エラー出力が復帰する。

標準出力て・・・orz ダレが返事するのかね??
なので、interactを利用しない方式に修正・・・

◇以下は、各シェルの中身
 □potal.poweredge.co.jp側(/root/bkup_db.sh)
———————————————————————–
#!/bin/bash

  1. 変数指定

USER=root
PASSWORD={PASSWORD}
BASEDIR=/tmp/DBBKUP
WIKIDIR=/var/www/html/wiki/
TARGET=root@staff.poweredge.co.jp
PSWD={PASSWORD}

#DB格納対象外ファイルのバックアップ&転送処理+ファイル圧縮
tar zcvf $BASEDIR/wikisrc_bk.tar.gz $WIKIDIR/LocalSettings.php $WIKIDIR/images $WIKIDIR/skins $WIKIDIR/extensions

#データベースバックアップ処理
#mensetsu
mysqldump -h localhost -u $USER -p$PASSWORD mensetsu_db -c > $BASEDIR/mensetsu_db_bk.sql

#redframe
mysqldump -h localhost -u $USER -p$PASSWORD redframe -c > $BASEDIR/redframe_bk.sql

#redmine
mysqldump -h localhost -u $USER -p$PASSWORD db_redmine -c > $BASEDIR/db_redmine_bk.sql

#wikidb
mysqldump -h localhost -u $USER -p$PASSWORD wikidb -c > $BASEDIR/wikidb_bk.sql

#wordpress
mysqldump -h localhost -u $USER -p$PASSWORD wordpress -c > $BASEDIR/wordpress_bk.sql

#wr_db_2013
mysqldump -h localhost -u $USER -p$PASSWORD wr_db_2013 -c > $BASEDIR/wr_db_2013_bk.sql

#転送対象ファイルを圧縮して1つにする
tar zcvf ./dbbkup.tar.gz $BASEDIR

#バックアップファイル転送
expect -c ”
set tomeout 120
spawn scp -r ./dbbkup.tar.gz $TARGET:/root
sleep 3

expect {
“Are you sure you want to continue connecting (yes/no)? ” {
send “yesr”
expect “password:”
send “${PSWD}r”
} “password:” {
send “${PSWD}r”
}
}

expect {
send “quitn”
}

———————————————————————–
今回のミソは、このシェルの最後の 「send “quitn”」を追加すること。
NGだったシェルには、ここに 「interact」 とだけ書いてあった。
「これだけかよ・・・」って思うかもしれないけど、知らないとハマるよ・・・
ということで豆知識(´・_・`)