ログを一般ユーザでも参照可能にするために、直近2ヶ月分のファイルを別階層へ同期するシェルスクリプトを作成しました。
2ヶ月分のファイルを同期し、同期先に3ヶ月分のファイルが作成されたら、最古ファイルを削除します。
まず、同期先と同期元のパスのみを記載したファイルを作成します。
# 記載方法:[同期元] [同期先]
# 同期元と同期先の間はスペースを空けて記載して下さい。
/var/log/cron /home/common/log/cron
/var/log/maillog /home/common/log/cron
.
.
.
上記のファイル内のパスを読み込む形でシェルスクリプトを作成します。
# !/bin/bash
# 同期元・同期先のパスを記載したファイルを読み込む
file='/home/common/log/log_path.txt'
# 同期元パスを抽出
rsync_from=(`awk '!/^#/{print $1}' "${file}"`)
# 同期先パスを抽出
rsync_to=(`awk '!/^#/{print $2}' "${file}"`)
# 現在の年月を取得
y_m=`date '+%Y%m01'`
# ループで回す
for((i=0;i<${#rsync_from[@]};i++))
do
#1ヶ月前のログファイルが存在すれば、
if test -e ${rsync_from[i]}-${y_m}; then
#1ヶ月前のログファイルを同期する
rsync -acv --numeric-ids ${rsync_from[i]}-${y_m} ${rsync_to}-${y_m}
#作成した同期ファイルに一般ユーザの読み込み権限を付与する
chmod 744 ${rsync_to[i]}-${y_m}
fi
#最新のログファイルを同期する
rsync -acv -numeric-ids ${rsync_from[i]} ${rsync_to[i]}
#作成した最新の同期ファイルに一般ユーザの読み込み権限を付与する
chmod 744 ${rsync_to[i]}-{y_m}
#同期先ファイルが3件あれば、最古ファイルを削除するため、ファイルの古い順に並べ、ファイル数を取得
file_count=`ls -1 ${rsync_to[i]}* | wc -l`
if test $file_count=3; then
most_old_file=`ls -ltr ${rsync_to[i]}* | head -1 | awk '{print $9}'
rm $most_old_file
fi
done
使用したコマンドの説明
-
awk
同期元・同期先のパスを記載したファイルからパスを切り取るのに使用しています。
【 awk 】コマンド(基本編)――テキストの加工とパターン処理を行う -
rsync
ファイルを同期するのに使用しています。
cpコマンドよりHDDにかかる負荷が少なく済みます。
【 rsync 】コマンド(その1)――ファイルやディレクトリを同期する -
chmod
作成した同期先ファイルのパーミッションを変更するのに使用しています。
【 chmod 】コマンド――ファイル/ディレクトリのパーミッション(許可属性)を変更する -
lsコマンドのオプション
-
-lパーミッションや作成日時など詳細情報を表示する -
-t更新時間順に並べる -
-r逆順で表示する
シェルスクリプトの説明
-
#!bin/bash -
シバンといい、bashスクリプトを指定しています。
この指定により、シェルスクリプトを実行する際に、使用しているシェルがzshなどのbash以外のシェルでも、bashスクリプトを直接実行できます。 -
${#rsync_from[@]} -
配列の要素数を表しています。
配列:${配列名[インデックス]}
配列の要素数:${#配列名[@]}
-
test -e
ファイルが存在するか確認しています。
【 test 】コマンド(基礎編)――ファイルの有無などを判定する
途中で困ったこと
クーロンで実行しようとすると、削除に失敗してしまいました。
その原因は、ここでした!↓
most_old_file=`ls -ltr ${rsync_to[i]}* | head -1 | awk '{print $9}'
最古ファイルを取得するために、lsコマンドで詳細表示して、逆順にした先頭行の1行を取得してから、ファイル名を切り取っているのですが、ファイル名を切り取る箇所で失敗していました。
lsコマンドは、クーロン上とコマンドラインとでは表示が異なり、クーロン上では「年」が表示されません。
そのため、最初はawkコマンドで10番目のフィールドを指定していたのですが、年が表示されないため、
フィールドが1つ減るので、9番目のフィールドを指定しなければならなかったのでした。
クーロン実行時に注意すること
シェルスクリプトをクーロンで実行する際には、
- コマンドの出力の違い
- パスは絶対パスで指定すること
- 環境変数
- シェルスクリプト自体に実行権限を付与すること
に注意する必要があります。