0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

シェルスクリプトで、ログファイルを別階層へ同期し、一般ユーザでも参照可能にする

0
Posted at

ログを一般ユーザでも参照可能にするために、直近2ヶ月分のファイルを別階層へ同期するシェルスクリプトを作成しました。
2ヶ月分のファイルを同期し、同期先に3ヶ月分のファイルが作成されたら、最古ファイルを削除します。

まず、同期先と同期元のパスのみを記載したファイルを作成します。

log_path.txt

# 記載方法:[同期元] [同期先]
# 同期元と同期先の間はスペースを空けて記載して下さい。
/var/log/cron /home/common/log/cron
/var/log/maillog /home/common/log/cron
.
.
.

上記のファイル内のパスを読み込む形でシェルスクリプトを作成します。

log.sh

# !/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

使用したコマンドの説明

シェルスクリプトの説明

  • #!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番目のフィールドを指定しなければならなかったのでした。

クーロン実行時に注意すること

シェルスクリプトをクーロンで実行する際には、

  • コマンドの出力の違い
  • パスは絶対パスで指定すること
  • 環境変数
  • シェルスクリプト自体に実行権限を付与すること

に注意する必要があります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?