タグ:シェルスクリプト ( 11 ) タグの人気記事
(Linux)MySQLのバックアップをシェルスクリプトで自動的に行う

MySQLのバックアップを行うには、大きく mysqlhotcopy を使う方法と mysqldump を使う方法があります。

mysqlhotcopy はテーブルをロックしてデータベースのファイルがあるディレクトリをそのままコピーする方法です。
ただし、MyISAM と ARCHIVE テーブルでのみ利用可能なのでInnoDBを使っているテーブルはバックアップ不可能です。

mysqldump はデータベースの内容をSQLファイルに出力する方法です。

mysqldumpによるバックアップはコストも高く、復元にも時間がかかるようなので、InnoDB以外を使っている場合で同じサーバで復元する場合はmysqlhotcopyを使ったほうがいいかもしれません。

ただ、バックアップファイルの扱いやすさはmysqldumpに利があるかと思います。(テキストエディタで中身確認できますしね。)


さて、今回 mysqlhotcopy と mysqldump を両方走らせて cron で自動実行するシェルスクリプトを作ってみました。
7日間の世代管理を行うようにしています。
バックアップはデータベース毎に取ります。


#!/bin/sh

#アーカイブ前の一時ディレクトリ
BACKDIRTMP=/var/backup/tmp/mysql

# バックアップ先ディレクトリ
BKDIR=/var/backup/mysql/day
MYPATH=$(cd $(dirname $0);pwd)

#世代管理(何日分残すか)
DAYAGO="7"

# MySQLrootパスワード
ROOTPASS=MySQLのルートユーザのパスワード

#日付・時刻取得し変数に代入
TIMESET=`date +%Y%m%d-%H%I%M`
#バックアップ先ファイル名を設定 設定ファイルにあるファイル名+日付.tar.gzする
BKFILE=${BKDIR}/mysql.$TIMESET.tar.gz

# データベース名取得
DBLIST=`ls -p /var/lib/mysql | grep / | tr -d /`

#一時退避先掃除
rm -rf ${BACKDIRTMP}/*

# データベースごとに一時退避先にバックアップ
for DBNAME in $DBLIST
do
#mysqlhotcopyによるバックアップ
mysqlhotcopy $DBNAME -u root -p $ROOTPASS $BACKDIRTMP
if [ $? = 0 ]; then
logger -t mysqlhotcopy "Backup OK mysqlhotcopy:${DBNAME}"
echo "Backup OK mysqlhotcopy:${DBNAME}"
else
#失敗したらその旨を表示かつ、ログに保存、メール送信
logger -t mysqlhotcopy "Backup NG mysqlhotcopy:${DBNAME}"
echo "Backup NG mysqlhotcopy:${DBNAME}"
${MYPATH}/mailsend.sh "バックアップ失敗通知" "実行バックアップスクリプト: ${0}
バックアップ対象: mysqlhotcopy mysqlDB名:${DBNAME}
バックアップに失敗しました。"
fi

#mysqldumpによるバックアップ
mysqldump -u root -p${ROOTPASS} $DBNAME --opt > ${BACKDIRTMP}/${DBNAME}_dump.sql | logger -t mysqldump
if [ $? = 0 ]; then
logger -t mysqldump "Backup OK mysqldump:${DBNAME}"
echo "Backup OK mysqldump:${DBNAME}"
else
#失敗したらその旨を表示かつ、ログに保存、メール送信
logger -t mysqldump "Backup NG mysqldump:${DBNAME}"
echo "Backup NG mysqldump:${DBNAME}"
${MYPATH}/mailsend.sh "バックアップ失敗通知" "実行バックアップスクリプト: ${0}
バックアップ対象: mysqldump mysqlDB名:${DBNAME}
バックアップに失敗しました。"
fi
done

# 退避先のバックアップを処理日名をつけてアーカイブ圧縮(失敗時はメール送信)
cd $(dirname ${BACKDIRTMP})
tar vzcf $BKFILE $(basename ${BACKDIRTMP}) ||
${MYPATH}/mailsend.sh "バックアップ失敗通知" "実行バックアップスクリプト: ${0}
バックアップ対象: mysql一時ファイルのアーカイブ処理に失敗しました。"


#-------yyyymmdd形式のファイルから古い物を削除-------
# 削除しきい日付(yyyymmdd)を設定。(DAYAGO日前の日付求める)
tday=`date -d "${DAYAGO} day ago" +%Y%m%d`

# 対象Dir配下のファイル名をwhileに渡し「$list」となる
ls $BKDIR|while read list
do
#ファイル名に「数字x8」が含まれている場合、
if [[ $list =~ [0-9]{8} ]] ; then
# $listから、「yyyymmdd」を取り出しepoch時間($fday)にする
fday=`expr $list : "mysql\.\([0-9]\{8\}\).*.tar.gz"`
#ファイル名から取得した「yyyymmdd」が本日の「yyyymmdd」よりも小さい場合
if [ -n "$fday" ] && [ $fday -lt $tday ]; then
# echo する
#echo $list
#削除する
rm -f ${BKDIR}/${list}
fi
fi
done


mysqldump はデータベースを指定しなかったり、--all-databases (-A) オプションを使うとデータベース全体が1ファイルにダンプできるようです。
また、上記スクリプトでは最適化を行う --opt を入れてますが、5.1 では明示的に指定しなくても --opt オプションが付くようですね。


週次、月次等のタイミングでバックアップを取りたければ、(Linux)バックアップシェルスクリプトで世代管理2にあるスクリプトを下記のようにちょこっと修正しやります。

#! /bin/sh

BKUP_DIR=/var/data/backup/day

#このスクリプトのパスを取得
MYPATH=$(cd $(dirname $0);pwd)

#バックアップ先から、指定したリポジトリ名ファイルの最新版を取得
FROM_FILE="`ls -lt ${BKUP_DIR}day/mysql* | head -n 1 | gawk '{print $9}'`"
#週次、月次のバックアップ先と、何日間のデータを残すか設定
case "$1" in
"week" ) TO_DIR="/var/data/backup/week/"
DAYAGO="+22"
;;
"month" ) TO_DIR="/var/data/backup/month/"
DAYAGO="+61"
;;
esac

#古いファイルを削除
find $TO_DIR -mtime $DAYAGO -type f -exec rm -f {} \;

#コピー
cp ${FROM_FILE} ${TO_DIR}



参考:
mysqlhotcopyでバックアップ&復元 - phpspot
MySQLのバックアップをとろう!(同じサーバー内) (プログラマ 福重 伸太朗 ~基本へ帰ろう~)
MySQL のバックアップ手法いろいろ | CollectiveMeta
MySQL :: MySQL 5.1 リファレンスマニュアル :: 7.12 mysqldump - データベースバックアッププログラム
MySQL :: MySQL 4.1 リファレンスマニュアル :: 4.9.7 mysqldump(テーブル構造とデータのダンプ)

mysqldumpでMySQLをバックアップする時のオプション | Nyan-Chew's Digital Life
[PR]
by Jehoshaphat | 2011-10-19 23:48 | Linux | Trackback | Comments(0)
(Linux)Subversionのバックアップ処理をhot-backup.pyを使って行う
当初、Subversionのバックアップは普通にリポジトリのファイルをシェルスクリプトでコピー(cp)するだけで考えてました。
しかし、そのままコピーしたのではまずいようです。

リポジトリ領域にアクセスするプロセスがなければ通常コピーでも構わないのですが、何かがアクセスしていると整合性が取れなくなるようです。

TortoiseSVNのヘルプでは、svnadmin hotcopy を使う方法が推奨されてました。
svnadmin hotcopy でリポジトリをコピーすると、整合性を保ったまま安全にリポジトリをまるごとコピー出来るようです。
書式としては下記のようになります。

svnadmin hotcopy path/to/repository path/to/backup --clean-logs

しかし、svnadmin hotcopy はリポジトリを全く同じものを安全にコピーするだけなので、アーカイブ化や世代管理などはできません。

これをアーカイブ化、世代管理ができるようにしたのが、svnadmin hotcopy をラッピングした hot-backup.py スクリプトです。

今回はCentOS5.5を使ったんですが、Redhat系は、/usr/share/doc/subversion-x.x.x/tools/backup にあるようです。
UbuntuなどのDebian系はsubversion-toolsというパッケージをインストールするとsvn-hot-backupコマンドとして使えるようになるようです。

世代管理は、subversion 1.4 付属の hot-backup.py だとスクリプト内の変数の値を変えないといけません。
hot-backup.py スクリプト内の先頭の方に、num_backups = 64 てのがあります。
この変数が残す世代数のようです。64は大きいので適宜調整します。

Subversion 1.6 付属の hot-backup.py だとスクリプト内の num_backups 変数が int(os.environ.get("SVN_HOTBACKUP_BACKUPS_NUMBER", 64)) となっています。
ここの値を直接書き換えることもできますし、環境変数 SVN_HOTBACKUP_BACKUPS_NUMBER を使うこともできるようです。
シェルスクリプトから呼び出す場合は、環境変数を使ったほうが楽かもしれません。


書式は、下記のとおりです。

./hot-backup.py リポジトリパス バックアップディレクトリパス

オプションで、--archive-type=圧縮形式 で指定した形式で圧縮してくます。
圧縮形式は、bz2 , gz , zip から選べます。

例:
./hot-backup.py --archive-type=gz /var/www/svn/devloprepo /var/backup/svn


これをスクリプト化してcronから呼ぶようにすると自動的にバックアップできますね。

とりあえず、cronから呼ぶスクリプトを作成してみました。

#! /bin/sh

#このスクリプトのパスを取得
MYPATH=$(cd $(dirname $0);pwd)
#hot-backup.py のパスを指定。CentOS5.5だと下記の場所にある。
SCRIPT_PATH=/usr/share/doc/subversion-1.4.2/tools/backup/hot-backup.py

#1.6付属の hot-backup.py を使った場合下記のように環境変数に世代数を入れることもできます。
#export SVN_HOTBACKUP_BACKUPS_NUMBER=3

#-------バックアップ処理-------
#バックアップ元ファイル読み込みパスと保存ファイル名読み込み、ループ開始
cat ${MYPATH}/bksrc_svn.dat | grep -v \# | while read REPO_DIR BKUP_DIR
do
#バックアップ処理
$SCRIPT_PATH --archive-type=gz $REPO_DIR $BKUP_DIR

#成功したらその旨を表示かつ、ログに保存
if [ $? = 0 ]; then
logger "SVN Backup OK $BKFILE"
echo "SVN Backup OK $BKFILE"
else
#失敗したらその旨を表示かつ、ログに保存、メール送信
logger "SVN Backup NG $BKFILE"
echo "SVN Backup NG $BKFILE"
${MYPATH}/mailsend.sh "SVN バックアップ失敗通知" "実行バックアップスクリプト: ${0}
バックアップ対象: ${REPO_DIR}
Subversionバックアップに失敗しました。"
fi
done

bksrc_svn.datというファイル(上記スクリプトと同じディレクトリに保存)に、バックアップ対象のリポジトリパスとバックアップ先を定義します。

vi bksrc_svn.dat
/var/www/svn/test/ /var/backup/svn
/var/www/svn/webdate/ /var/backup/svn
/var/www/svn/devlop_java/ /var/backup/svn


処理に失敗したらメールを飛ばすようにしていますが、メールを飛ばす部分は、(Linux)シェルスクリプトでメールを送信するを参考してください。

参考:
Subversionリポジトリのバックアップ方法いろいろ - ぱせらんメモ
2007-07-11 - mir the developer
2007-05-06 - tmishina’s diary
[PR]
by Jehoshaphat | 2011-10-09 11:57 | Linux | Trackback | Comments(0)
(Linux)指定したディレクトリで一番新しいファイルを探す
シェルスクリプトの中で、任意のディレクトリの中で一番新しいファイルを探す方法です。

シェルスクリプトで最新のファイル名を取得するを参考にさせてもらいました。
まぁ、参考というよりそのままですが、下記のように、ls -lt でソートし、その一番上の行を取得、9列目のファイル名を取得するようにすればいいようです。

スクリプト実行中のパスのファイルに対して行うは下記
LATEST_FILE="`pwd`/`ls -lt *.txt | head -n 1 | gawk '{print $9}'`"

任意のディレクトリに対して行うには下記
LATEST_FILE="`ls -lt *.txt | head -n 1 | gawk '{print $9}'`"

[PR]
by Jehoshaphat | 2011-10-09 11:55 | Linux | Trackback | Comments(0)
(Linux)コマンドを連結して行う「;」「&」「&&」「||」の違い
シェルスクリプトにおいて、複数のコマンドを連結して処理するときに、「;」「&」「&&」「||」が使えるですんが、それぞれがどのような動きするかまとめてみました。

;(セミコロン)
前のコマンドが終わり次第、次のコマンドが実行される。(3つ以上のコマンドを連結してOKみたい)

#command1 を実行し、実行後 command2 を実行する。
command1 ; command2


&(アンパサンド)
;(セミコロン)は前のコマンドの完了を待っていたが、&は待たない。

#command1 を実行しながら、command2 を実行する。
command1 & command2


&&
前のコマンドがうまく終了した(終了ステータスが0)なら、次のコマンドを実行。そうでないなら次のコマンドは実行しない。

#command1 が 0 を返した場合、command2 を実行
command1 && command2

例:
#configureが成功したらmake,makeが成功したらmake installする
configure && make && make install

#/home/a.txtがあれば cp コマンドでコピーする
[ -f /home/a.txt ] && cp /home/a.txt /var/bkup
↑のように、テストコマンドの戻り値も使うことができる。
こうすることで、if文の行数を減らせるかもしれない。
if文だと下記のようになる。
if [ -f /home/a.txt ] then
cp /home/a.txt /var/bkup
if



||
&&とは逆で前のコマンドに失敗(終了コード0以外)したら、次のコマンドを実行する。

#command1 が 0 以外を返した場合、command2 を実行
command1 || command2

例:
#command1が失敗したら指定したディレクトリ削除
command1 || rm -rf /home/hoge/tmp


参考:
最低限 UNIX / Linux [III] 【シェルスクリプト】
UNIXの部屋 コマンド検索:シェル記号類まとめ (*BSD/Linux)
PC UNIXの起動と起動ファイルの解読@謎の処理系 SunOS 4.1.4 with Linux/FreeBSD

[PR]
by Jehoshaphat | 2011-10-05 00:23 | Linux | Trackback | Comments(1)
(Linux)パスを含む変数をdirname,basenameしてコマンドに渡したい
((Linux)シェルスクリプトで自身の絶対パスを取得したいも似たような記事になってます。)

例えば下記のようなシェルスクリプトがあるとします。


BKFILE="/var/bkup/user.tgz"
BKSRC="/home/hoge/"

BKSRC_UP=`dirname ${BKSRC}`
BKSRC_NAME=`basename ${BKSRC}`

cd $BKSRC_UP
tar vzcf $BKFILE $BKSRC_NAME


相対パスでtarを使ってバックアップするスクリプトですが、/home/hoge/ の上のフォルダをバックアップしたいのに、いちいち一時変数(BKSRC_NAME)に入れてから tar コマンドにかけないといけません。
また、相対パスでtarを使いたいわけですが、チェンジディレクトリするためにまた一時変数に入れないといけません。

で、ググルと内気でシャイな相対男子、dirnameで絶対男子になるの巻 - i am voidに参考になる情報が。。
$()を使うと一時変数にいちいち入れなくてもいいようです。

ということで、上記のスクリプトを書きなおしたのが下記です。

BKFILE="/var/bkup/user.tgz"
BKSRC="/home/hoge/"

cd $(dirname ${BKSRC})
tar vzcf $BKFILE $(basename $BKSRC)


参考:
シェルスクリプトにおける相対パスから絶対パスへの変換 LAMP Tips
[PR]
by Jehoshaphat | 2011-10-05 00:20 | Linux | Trackback | Comments(0)
(Linux)バックアップシェルスクリプトで世代管理2

(Linux)バックアップシェルスクリプトで世代管理1で、世代管理機能付きのバックアップシェルスクリプトを書きました。
しかし、いざ運用を始めると数ヶ月前のデータがほしいなんてことも想定されます。

ということで、下記のようなバックアッププランを立てました。
・日次バックアップ(直近7日間保存)
・週次バックアップ(直近3週間分保存)
・月次バックアップ(直近2ヶ月間保存)

具体的に、日次バックアップは(Linux)バックアップシェルスクリプトで世代管理1のスクリプトで cron を使い毎日動かします。
週次バックアップと、月次バックアップは下記スクリプトを使い、日次バックアップのアップの最新版を各週次・月次バックアップ先にコピーし古いファイルは削除するようにしました。(なお、今回古いファイルの削除はファイルの更新日時から判断するようにしています。)
スクリプトの引数で、週次(week)か月次(month)か判断するようにしています。
スクリプトファイルは、(Linux)バックアップシェルスクリプトで世代管理1のスクリプトと同じディレクトリに保存します。
ファイル名は、/root/sh/bkup_cp.sh とします。

#! /bin/sh

#このスクリプトのパスを取得
MYPATH=$(cd $(dirname $0);pwd)

#週次バックアップ先
TO_DIR_WEEK="/var/backup/week/"
#週次で更新日時が22日より古いデータは削除対象
DAYAGO_WEEK="22"

#月次バックアップ先
TO_DIR_MONTH="/var/backup/month/"
#月次で更新日時が61日より古いデータは削除対象
DAYAGO_MONTH="61"

#bkup.shで使っているバックアップ対象バックアップ先設定ファイル(bksrc.dat)を使用
cat ${MYPATH}/bksrc.dat | grep -v \# | while read BKSRC_DIR BKUP_DIR
do
#バックアップ先から、指定したバックアップファイルの最新版を取得
FROM_FILE="`ls -lt ${BKUP_DIR}* | head -n 1 | gawk '{print $9}'`"
#週次、月次のバックアップ先と、何日間のデータを残すか設定
case "$1" in
"week" ) TO_DIR=$TO_DIR_WEEK
DAYAGO="+${DAYAGO_WEEK}"
;;
"month" ) TO_DIR=$TO_DIR_MONTH
DAYAGO="+${DAYAGO_MONTH}"
;;
esac

#更新日時が指定より古いファイルを削除
find $TO_DIR -mtime $DAYAGO -type f -exec rm -f {} \;

#コピー
cp ${FROM_FILE} ${TO_DIR}
done


cron の設定は下記のようになります。

#日次バックアップ
0 4 * * * /root/sh/bkup.sh
#週次バックアップ(日曜)
0 5 * * 0 /root/sh/bkup_cp.sh week
#月次バックアップ(毎月一日)
0 6 1 * * /root/sh/bkup_cp.sh month



ちなみに、テストでファイルの日付を変更する必要がありますが、touchコマンドを使うとmtime が変更できるようです。


mtimeを2011/4/11 1:00:00 に変更
touch -t 201104110100.00 hoge.txt


atime,ctime,mtimeの確認は、stat コマンドを使えばいいようです。

# stat hoge.txt
File: `hoge.txt'
Size: 18 Blocks: 16 IO Block: 4096 通常ファイル
Device: fd00h/64768d Inode: 25624583 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2011-05-09 17:11:04.000000000 +0900
Modify: 2011-05-09 17:10:46.000000000 +0900
Change: 2011-05-09 17:10:46.000000000 +0900


参考:
【 更新日時を現在に変更する 】 - Linuxコマンド逆引き大全:ITpro
ファイルやディレクトリの最終更新日時を変更する - 試験運用中なLinux備忘録
ctimeは、内容か属性が修正された日時を指し、作成日時を指すのではない - 試験運用中なLinux備忘録
[PR]
by Jehoshaphat | 2011-10-05 00:09 | Linux | Trackback | Comments(0)
(Linux)バックアップシェルスクリプトで世代管理1
ずいぶん前の記事、cron & シェルスクリプト でバックアップ用のシェルスクリプトを書きました。
設定ファイル(bksrc.dat)にバックアップ元ディレクトリパスと、バックアップ時の接頭ファイル名を定義し、ファイル名に日付を埋め込んでtgzファイルにバックアップするというものでした。
しかし、世代管理の仕組みをいれてなかったので、ずっとバックアップが溜まり続けます。

ということで、古くなったバックアップファイルを削除する処理、そしてエラーがあったらメールを飛ばす処理を追加してみました。

メインのバックアップスクリプト(/root/sh/bkup.sh)は下記のようになります。

#!/bin/sh

#このスクリプトのパスを取得
MYPATH=$(cd $(dirname $0);pwd)
#世代管理(何日分残すか)
DAYAGO="7"

#-------バックアップ処理-------

#バックアップ元ファイル読み込みパスと保存ファイル名読み込み、ループ開始
cat ${MYPATH}/bksrc.dat | grep -v \# | while read BKSRC_DIR_NAME BKTO_NAME
do
BKSRC=.$BKSRC_DIR_NAME
#日付・時刻取得し変数に代入
TIMESET=`date +%Y%m%d-%H%I%M`
#バックアップ先ファイル名を設定 設定ファイルにあるファイル名+日付.tar.gzする
BKFILE=${BKTO_NAME}.$TIMESET.tar.gz
cd /
if [ -d $BKSRC ]; then
#バックアップ対象がディレクトリの場合
cd $(dirname ${BKSRC})
#tarコマンドで元ディレクトリを圧縮(相対パス指定)
tar vzcf $BKFILE $(basename ${BKSRC})
else [ -f $BKSRC ]
#バックアップ対象がファイルの場合
cd $(dirname $(dirname $BKSRC))
#tarコマンドで元ディレクトリを圧縮(相対パス指定)
tar vzcf $BKFILE $(basename $(dirname ${BKSRC}))/$(basename ${BKSRC})
fi

#成功したらその旨を表示かつ、ログに保存
if [ $? = 0 ]; then
logger -t dir_bkup "Backup OK $BKFILE"
echo "Backup OK $BKFILE"
else
#失敗したらその旨を表示かつ、ログに保存、メール送信
logger -t dir_bkup "Backup NG $BKFILE"
echo "Backup NG $BKFILE"
${MYPATH}/mailsend.sh "hoge@hoge.com" "バックアップ失敗通知" "実行バックアップスクリプト: ${0}
バックアップ対象: ${BKSRC_DIR_NAME}
バックアップに失敗しました。"
fi
#アクセス権を変更
chmod 666 $BKFILE

#-------yyyymmdd形式のファイルから古い物を削除-------
# 削除しきい日付(yyyymmdd)を設定。(DAYAGO日前の日付求める)
tday=`date -d "${DAYAGO} day ago" +%Y%m%d`

# 対象Dir配下のファイル名をwhileに渡し「$list」となる
ls $(basename ${BKTO_NAME})|while read list
do
#ファイル名に「数字x8」が含まれている場合、
if [[ $list =~ [0-9]{8} ]] ; then
# $listから、「yyyymmdd」を取り出しepoch時間($fday)にする
fday=`expr $list : "${BKTO_NAME}\.\([0-9]\{8\}\).*.tar.gz"`
#ファイル名から取得した「yyyymmdd」が本日の「yyyymmdd」よりも小さい場合
if [ -n "$fday" ] && [ $fday -lt $tday ]; then
# echo する
#echo $list
#削除する
rm -f $(basename ${BKTO_NAME})/${list}
fi
fi
done
done

削除処理はシェルスクリプトで日付の文字列を比較できないでしょうか? - Yahoo!知恵袋の回答で上がってたのを使わせてもらいました。
ファイル名に8文字の数字があるかどうかをチェックし、あった場合、数値に変換して削除しきい日を比較し、しきい日より小さければ削除するというものです。


失敗したらメールを送るようにしてますが、mailsend.sh については、(Linux)シェルスクリプトでメールを送信するを参考にしてください。


設定ファイル(/root/sh/bksrc.dat)の書式は下記のような感じです。

バックアップ先絶対パス バックアップ先DIR+ファイル名の接頭語
/var/www/html /var/backup/htmldata
/var/www/svn /var/backup/subversion


世代管理としては、findでファイル自身の更新日時で比較する方法が多いですが、このようにファイル名の中の日付で比較できるのはいいですね。
上記のスクリプトを cron で毎日実行するようにすれば日次バックアップが可能です。

上記のスクリプトでは、バックアップしたファイル名に対して削除するかどうか判定してますが、ただ単に指定したディレクトリすべてのファイルを対象にしたい場合は下記のように正規表現を直せばOKです。


#!/bin/sh

BKDIR=/var/backup/day/

#-------yyyymmdd形式のファイルから古い物を削除-------
# 削除しきい日付(yyyymmdd)を設定
tday=`date -d "7 day ago" +%Y%m%d`

# 対象Dir配下のファイル名をwhileに渡し「$list」となる
ls $BKDIR|while read list
do
#ファイル名に「数字x8」が含まれている場合、
if [[ $list =~ [0-9]{8} ]]
then
# $listから、「yyyymmdd」を取り出しepoch時間($fday)にする
fday=`expr $list : ".*\([0-9]\{8\}\).*.tar.gz"`
#ファイル名から取得した「yyyymmdd」が本日の「yyyymmdd」よりも小さい場合
if [ -n "$fday" ] && [ $fday -lt $tday ]; then
# echo する
#echo $list
#削除する
rm -f ${BKDIR}/${list}
fi
fi
done

[PR]
by Jehoshaphat | 2011-10-05 00:07 | Linux | Trackback | Comments(0)
(Linux)シェルスクリプトでメールを送信する
メール送信を行うシェルスクリプトです。
スクリプト:シェルスクリプト:メール送信|ADSL + 自宅 Linux サーバを参考にさせてもらいました。(ほぼそのままですが...)

汎用的に使えるように、引数1 に送信先メールアドレス、引数2 に件名、引数3 に本文を指定します。本文は改行を反映させるため、$2使用時にクォートしています。


#!/bin/sh
#引数1:メール送信宛先
#引数2:件名
#引数3:本文

address=$1
subject=$2

# 件名の文字コードをJISに変換
subject=`echo $subject | nkf -j`
# メール送信(コマンド結果はSJISに変換)
mail -s "$subject" $address << _EOT_
`echo "$3" | nkf -j`
_EOT_

# 終了
exit



後は、/etc/aliases で送信するユーザのアドレスを指定します。
詳しくは、(Linux)LogwatchのログメールをGmailに送りたいの 3. が参考にしてください。
もし、送信元アドレスがSMTP認証しないといけないなら、上記リンクの1.から設定する必要があります。
[PR]
by Jehoshaphat | 2011-10-05 00:04 | Linux | Trackback | Comments(0)
(Linux)シェルスクリプトで変数に改行を含めたい

シェルスクリプトの変数に改行を含む文字列を入れる方法です。


VAR="test1
test2
test3
"
echo "${VAR}" ←改行含まれる
test1
test2
test3

echo ${VAR} ←これだと改行コードが無視される。
test1test2test3

注意として、改行含む変数を使うときに、クォーテーションでくくらないといけないということですね。

bashなどのシェル変数の値に改行を含める事は可能でしょうか? - Linux系OS - 教えて!goo:
[PR]
by Jehoshaphat | 2011-10-05 00:02 | Linux | Trackback | Comments(0)
(Linux)シェルスクリプトで自身の絶対パスを取得したい
シェルスクリプトで、自分自身のスクリプトの絶対パスを取得する方法ですが、下記のようにするといいようです。

#!/bin/sh
#↓自身のスクリプトの絶対パス(ファイル名無し)
echo $(cd $(dirname $0);pwd)
#↓自身のスクリプトの絶対パス(ファイル名有り)
echo $(cd $(dirname $0) && pwd)/$(basename $0)

結果:
/root/sh
/root/sh/test01.sh


ちなみに、これで知ったのですが、「$()」でコマンドの実行結果を取れるようです。「``」と同じ意味みたいです。
「$()」のほうがネストが効くので使いやすいかもしれません。


参考:
シェルスクリプトで相対パス指定したファイルを絶対パスへ変換する | 半袖野郎 blog.hansode.org
Bashシェルスクリプトで自分の絶対パスを取得 | #8
変数を使用する - UNIX & Linux コマンド・シェルスクリプト リファレンス
[PR]
by Jehoshaphat | 2011-09-26 01:44 | Linux | Trackback | Comments(0)