垂れ流しているログのローテートの時に注意すること


ちょっと前にハマったのでメモメモ。
ちなみにlogloteコマンド使わない感じの制約有りです。。。

-
 
# 1. 経緯

少し前に `sysstatコマンド` のログを垂れ流し状態にしたままログファイルにリダイレクトしてて、
それを日時単位でローテートしましょうということになった。
いちいち手動でやるのがめんどうだったので、ツール化することに。。。

````ツール①
#!/bin/sh

ADDR="www.google.com"
LOG="/root/ping.log"

ping ${ADDR} > ${LOG}

````

````ツール②
#!/bin/sh

LOG="/root/ping.log"

if [ -e ${LOG} ]; then
	cp -p ${LOG} ${LOG}_`date +%Y%m%d`
	cat /dev/null > ${LOG}
else
	echo Error!!
fi

````


ツール②で一瞬ファイルクリアされていると思いきや、
実は肥大化していく一方なんですね…。。。


````動かしてみたログ
[root@localhost ~]# 
[root@localhost ~]# date;nohup ./tools01.sh &
2015年 12月 31日 木曜日 15:58:11 JST
[1] 3184
[root@localhost ~]# nohup: ignoring input and appending output to `nohup.out'

[root@localhost ~]# ll
合計 12
-rw-------. 1 root root   0 12月 31 15:58 2015 nohup.out
-rw-r--r--. 1 root root 235 12月 31 15:58 2015 ping.log
-rwxr--r--. 1 root root  78 12月 31 15:43 2015 tools01.sh
-rwxr--r--. 1 root root 139 12月 31 15:54 2015 tools02.sh
[root@localhost ~]# 
[root@localhost ~]# date;ll
2015年 12月 31日 木曜日 15:58:30 JST
合計 12
-rw-------. 1 root root    0 12月 31 15:58 2015 nohup.out
-rw-r--r--. 1 root root 1653 12月 31 15:58 2015 ping.log
-rwxr--r--. 1 root root   78 12月 31 15:43 2015 tools01.sh
-rwxr--r--. 1 root root  139 12月 31 15:54 2015 tools02.sh
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# date;ll;./tools02.sh;ll
2015年 12月 31日 木曜日 15:58:39 JST
合計 12
-rw-------. 1 root root    0 12月 31 15:58 2015 nohup.out
-rw-r--r--. 1 root root 2365 12月 31 15:58 2015 ping.log
-rwxr--r--. 1 root root   78 12月 31 15:43 2015 tools01.sh
-rwxr--r--. 1 root root  139 12月 31 15:54 2015 tools02.sh
合計 12
-rw-------. 1 root root    0 12月 31 15:58 2015 nohup.out
-rw-r--r--. 1 root root    0 12月 31 15:58 2015 ping.log			★一旦、ファイルサイズ0になった
-rw-r--r--. 1 root root 2365 12月 31 15:58 2015 ping.log_20151231
-rwxr--r--. 1 root root   78 12月 31 15:43 2015 tools01.sh
-rwxr--r--. 1 root root  139 12月 31 15:54 2015 tools02.sh
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# date;ll
2015年 12月 31日 木曜日 15:58:49 JST
合計 16
-rw-------. 1 root root    0 12月 31 15:58 2015 nohup.out
-rw-r--r--. 1 root root 3166 12月 31 15:58 2015 ping.log			★bkしたファイルサイズ＋更新分サイズになった
-rw-r--r--. 1 root root 2365 12月 31 15:58 2015 ping.log_20151231
-rwxr--r--. 1 root root   78 12月 31 15:43 2015 tools01.sh
-rwxr--r--. 1 root root  139 12月 31 15:54 2015 tools02.sh
[root@localhost ~]# 
[root@localhost ~]# 
````

このやり方だと、ローテートしている意味がまったくない。

# 2. 改善

今回は `pingコマンド` の結果をそのままログファイルにリダイレクトしてしまったことが原因で
ログファイルを初期化してもファイルサイズがどんどん肥大化してしまった模様。

ググッてみた感じ、同じ感じの事象にハマった人も多いらしい。。。

この事象の対策としては、 `teeコマンド` を使うのがいいらしい。
直接ログファイルにリダイレクトするのではなく、一旦標準出力した情報をログファイルに書き出すのがいいらしい。

なのでツール（①の方だけ修正必要）をこんな感じに修正する。

````ツール①_NEW
#!/bin/sh

ADDR="www.google.com"
LOG="/root/ping.log"

ping ${ADDR} | tee -a ${LOG} > /dev/null

````

修正するとさっきみたくログファイルは肥大化しないで済む。


````動かしてみたログ
[root@localhost ~]# 
[root@localhost ~]# date;./tools01_new.sh &
2015年 12月 31日 木曜日 16:35:28 JST
[1] 4025
[root@localhost ~]# 
[root@localhost ~]# date;ll
2015年 12月 31日 木曜日 16:35:37 JST
合計 16
-rw-r--r--. 1 root root 852 12月 31 16:35 2015 ping.log
-rwxr--r--. 1 root root  78 12月 31 15:43 2015 tools01.sh
-rwxr--r--. 1 root root  97 12月 31 16:32 2015 tools01_new.sh
-rwxr--r--. 1 root root 139 12月 31 15:54 2015 tools02.sh
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# date;ll
2015年 12月 31日 木曜日 16:35:59 JST
合計 16
-rw-r--r--. 1 root root 2543 12月 31 16:35 2015 ping.log
-rwxr--r--. 1 root root   78 12月 31 15:43 2015 tools01.sh
-rwxr--r--. 1 root root   97 12月 31 16:32 2015 tools01_new.sh
-rwxr--r--. 1 root root  139 12月 31 15:54 2015 tools02.sh
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# date;ll;./tools02.sh;ll
2015年 12月 31日 木曜日 16:36:06 JST
合計 16
-rw-r--r--. 1 root root 3166 12月 31 16:36 2015 ping.log
-rwxr--r--. 1 root root   78 12月 31 15:43 2015 tools01.sh
-rwxr--r--. 1 root root   97 12月 31 16:32 2015 tools01_new.sh
-rwxr--r--. 1 root root  139 12月 31 15:54 2015 tools02.sh
合計 16
-rw-r--r--. 1 root root    0 12月 31 16:36 2015 ping.log
-rw-r--r--. 1 root root 3166 12月 31 16:36 2015 ping.log_20151231
-rwxr--r--. 1 root root   78 12月 31 15:43 2015 tools01.sh
-rwxr--r--. 1 root root   97 12月 31 16:32 2015 tools01_new.sh
-rwxr--r--. 1 root root  139 12月 31 15:54 2015 tools02.sh
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# date;ll
2015年 12月 31日 木曜日 16:36:11 JST
合計 20
-rw-r--r--. 1 root root  534 12月 31 16:36 2015 ping.log
-rw-r--r--. 1 root root 3166 12月 31 16:36 2015 ping.log_20151231
-rwxr--r--. 1 root root   78 12月 31 15:43 2015 tools01.sh
-rwxr--r--. 1 root root   97 12月 31 16:32 2015 tools01_new.sh
-rwxr--r--. 1 root root  139 12月 31 15:54 2015 tools02.sh
[root@localhost ~]# 
[root@localhost ~]#
````