[Armadillo:05561] Re: 連続運用時のログ取扱いについて

Yasushi SHOJI email@hidden
2010年 8月 4日 (水) 11:48:00 JST


At Tue, 03 Aug 2010 19:32:55 +0900,
SAITOH akinori wrote:
> 
> >> kill -HUP `cat /var/run/syslogd.pid
> > を行わなくても、正常に動作したのは[mv]ではなく[cp]を使ったからでしょ 
> > うか?
> 最近のsyslogは優秀なのかな。
> rm /var/log/messages
> ってやると、無くなった(lsでは見えない)ファイルに書き続けて
> /var/log/messagesは空っぽのまま・・・ってのがsyslogの
> 動作だったんですが、以前は。

SIGHUPは、syslogに「再初期化しなさい」という命令の意味を持っています。
syslogは、初期化時に設定ファイルやデフォルト値に従って/var/log/message
などのファイルを open()します。

cronなど外部から /var/log/messageを (同一ファイルシステム内で)「mv」し
ても、ファイルの「名前」が変更されるだけで、ファイルの「中身」は、その
ままファイルシステム上にあるだけです。syslogが open()し、得た file
descriptorは、(名前は変ったけど)同じファイルを指しつづけます。そのため、
仮に

     mv /var/log/message /var/log/newfile

としても、syslogは/var/log/newfileに書き続けます。書き出し毎に
/var/log/message を新しく作成し、書き出すわけではありません。なので、
「ファイルを変更したので、初期化してね」という意味で、SIGHUPを投げてあ
げます。

# ちなみに、ファイルの中身から名前を探すことはできません。ファイルの名
# 前と中身は一意に紐付けられているわけではないので。
#       echo hello > hello.txt
#       ln hello.txt world.txt
# とし、ハードリンクを作成すると二つの名前から参照される1つのファイルを
# 簡単に作成できます。

シグナルを受けた syslogは、設定ファイルにそって、/var/log/messageなどを
作成し、ログを書きはじめます。

「cp」は、mvと違い、指定されたファイルの中身を、新しい名前を付けたファ
イルにコピーするツールです。なので /var/log/message は、中身を読まれる
だけです。syslogはまったく影響を受けず、そのまま /var/log/messageに書き
続けます。そのため、SIGHUPを送る必要はありません。

ちなみに、

	cat /dev/null > /var/log/message

とすると、中身を消すことができます。rmして touchするくらいなら、こちら
の方が簡単です。これをやっても、cp と cat の間に syslogが書き出した情報
は消えます。
-- 
             yashi




armadillo メーリングリストの案内