/etc/cron.daily/logrotateを見てみた

Logrotate AWS
Logrotate

前書き

logrotateを触る機会があり、logrotateがcronで動いているとのことでどんなコマンドで動いてるのか気になり調べてみました。

shell script得意でないので結構勉強になりましたので、メモがわりに残します。

環境

EC2で起動したubuntu18.04まま

本編

#!/bin/sh

# Clean non existent log file entries from status file
cd /var/lib/logrotate
test -e status || touch status
head -1 status > status.clean
sed 's/"//g' status | while read logfile date
do
    [ -e "$logfile" ] && echo "\"$logfile\" $date"
done >> status.clean
mv status.clean status

test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf

上記が/etc/cron.daily/logrotateの中身

cd /var/lib/logrotate

ここでは単純に/var/lib/logrotateに移動する

test -e status || touch status

testコマンド … 条件式を評価して、真偽の値を返すコマンド。主にシェルスクリプトで使われる
-eはファイルが存在するかしないかをチェックしている。
終了ステータスは、成功時に0、失敗時に1が返ってくるので、プラグラミング言語などとは感覚的に逆になっている

test -e /var/lib/logrotate/status; echo $?

実際に上記を叩くと、0が返ってくるので、存在すると言うこと
https://www.atmarkit.co.jp/ait/articles/1807/05/news041.html

*echo $?は、終了ステータスを出すだけ
コマンドの成否を$?で表している

“||” はOR制御演算子であり、前のコマンドが1を返したら実行する

つまり、/var/lib/logrotate/statusがなければ、touchで作成する言うもの

head -1 status > status.clean

head -1 statusは、statusファイルの最初の1行目を表すもの。
head -n 1 statusと同義。

ちなみに、がtail -1 {file name}で、最後の1行目を表す

sed ‘s/”//g’ status

sedは Stream EDitor の略。

sedは様々なことを行えるが今回は文字列の置き換えをしている

文字列の置き換えは、「s/置換前/置換後/」
つまり、”/ → {空白} にしている

ちなみにsed コマンドのオプション-eは省略することができるので、 以下でも動く
sed -e ‘s/”//g’ status | while read logfile date

logrotate state -- version 2
"/var/log/syslog" 2020-9-4-6:25:2
"/var/log/dpkg.log" 2020-9-3-15:40:4
"/var/log/unattended-upgrades/unattended-upgrades.log" 2020-9-3-16:32:22
"/var/log/unattended-upgrades/unattended-upgrades-shutdown.log" 2020-5-31-6:0:0
"/var/log/auth.log" 2020-9-3-16:32:22
"/var/log/apt/term.log" 2020-9-3-15:40:4
"/var/log/apport.log" 2020-9-4-6:0:0
"/var/log/apt/history.log" 2020-9-3-15:40:4
"/var/log/alternatives.log" 2020-9-3-6:25:1
.
.
.

statusは上記なので、実際にsed -e ‘s/”//g’ statusを行ってみると以下になる

logrotate state -- version 2
/var/log/syslog 2020-9-4-6:25:2
/var/log/dpkg.log 2020-9-3-15:40:4
/var/log/unattended-upgrades/unattended-upgrades.log 2020-9-3-16:32:22
/var/log/unattended-upgrades/unattended-upgrades-shutdown.log 2020-5-31-6:0:0
/var/log/auth.log 2020-9-3-16:32:22
/var/log/apt/term.log 2020-9-3-15:40:4
/var/log/apport.log 2020-9-4-6:0:0
/var/log/apt/history.log 2020-9-3-15:40:4
/var/log/alternatives.log 2020-9-3-6:25:1
.
.
.

また、その結果を以下while read logfile dateで処理している

while read logfile date ~ done >> status.clean

whileは以下の形で動くもので、「ある条件が成り立っている間のみ繰り返し処理を行う」というもの

while 条件式
do
    処理
done

詳しくはhttps://shellscript.sunone.me/while.htmlを参考に。

while read logfile date
do 
   処理
done >> status.clean

上記は/etc/cron.daily/logrotateのwhile文部分である。

変数logfileに、logのpath(/var/log/syslogなど)
変数dateに、実行時間(2020-9-4-6:25:2など)
が格納され、処理が走り、status.cleanに追記されていくというもの。

処理では、以下が走っており、
[ -e “$logfile” ] && echo “\”$logfile\” $date”

$logfileがあるならば、echo “\”$logfile\” $date” 処理を行うというもの
-e はファイルチェックに使われるオプション。

mv status.clean status

実行結果を格納したstatus.cleanファイルをstatusファイルに名前変更する

test -x /usr/sbin/logrotate || exit 0

先ほども出てきたtestコマンド。
今回は-xオプションで実行しており、/usr/sbin/logrotateが実行可能であるかを判別している
この文は実行可能でなければ、exit 0をするということになる。

||に関する説明は以下記事がわかりやすい
https://oplern.hatenablog.com/entry/2017/05/14/152437

/usr/sbin/logrotate /etc/logrotate.conf

最後は上記を実行し、ログローテートを行う
/usr/sbin/logrotateがバイナリファイルであったため中身が確認できていないが、/etc/logrotate.confを引数に持ち実行するものであるだろうと思われる

所感

最後の2文以外は、ファイルのチェックや、再書き込みを行っているだけというのがざっくりした部分。

なぜこの作りになっているかは調べたいところ。

余談

echo -e hello\world >> hello.html
は、-eが改行を表示するオプション、>>がファイルに追加する演算子

2回上記を打つとaaa.htmlには、以下が格納される
hello
world
hello
world

コメント

タイトルとURLをコピーしました