回答編集履歴

1

文の順番入れ替え

2023/11/01 14:26

投稿

otn
otn

スコア85773

test CHANGED
@@ -1,16 +1,16 @@
1
1
  logrotateは、prerotateやpostrotateでコマンドを実行することを除けばファイルをリネームして新規作成するだけです。
2
+
3
+ Unix/Linuxの場合は、稼働中のプロセスが`aaa.log`をオープンしたままでログを書いている時に`mv aaa.log aaa.log.1; touch aaa.log`をした場合、プロセスはファイルの名前が変わったことなど無関係なので、そのまま最初にオープンしたファイル(現在は`aaa.log.1`という名前に変わっている)に書き続けます。
4
+ ファイル名はオープンの時に必要なだけで、オープンしたら無用で、`mv`や`rm`してもプログラム動作に無関係です。
2
5
 
3
6
  稼働中のプロセスがオープンしたままの古いログファイルをクローズして、新規作成されたファイルをオープンし直すのは、稼働中のプロセスにその旨指示する必要があります。デーモンプロセスはSIGHUPを未使用(※1)なので、「SIGHUPを受け取るとファイルをオープンし直す」という仕様のデーモンプロセスが多いようですので、そういうプロセスの場合は、postrotateでSIGHUPを送るコマンドを実行します。
4
7
  (※1: SIGHUPは制御端末に関するシグナルだが、デーモンは制御端末を持たないので本来のSIGHUPを受け取ることは無い)
5
8
 
6
- Unix/Linuxの場合は、稼働中のプロセスが`aaa.log`をオープンしたままでログを書いている時に`mv aaa.log aaa.log.1; touch aaa.log`をした場合、プロセスは名前が変わったことなど無関係なので、そのまま最初にオープンしたファイル(現在は`aaa.log.1`という名前に変わっている)に書き続けます。
7
- ファイル名はオープンの時に必要なだけで、オープンしたら無用で、`mv`や`rm`してもプログラム動作に無関係です。
8
-
9
- こういう「ログファイルをオープンしっぱなしで書く」じゃなくて、「ログを書く都度、オープン、書き込み、クローズ」を繰り返している場合(オーバーヘッドが大きいので普通はしないが、大量にログを書くことが絶対にあり得ないプログラムならあるかも)は、オープン時点で`aaa.log`と言う名前のファイルに書きます。
10
-
11
9
  「HUPを送る」とかは、「ログファイルをオープンしっぱなしのデーモンプロセスは、上記のような仕様のことが多い」という以上の意味は無いので、そういう仕様かどうか確認すること無しにHUPを送っても無駄かも知れません。
12
10
 
13
- そういう「外部からの指示でファイルをオープンし直す」機能を持たないプログラムの場合は、HUPを送ってもしょうがないので、ログファイルをオープンし直すにはプログラムの停止&再起動などが必要です。
11
+ そういう「外部からの指示でファイルをオープンし直す」機能を持たないプログラムの場合は、HUPを送ってもしょうがないので、ログファイルをオープンし直すには、postrotateでプログラムの停止&再起動などが必要です。
12
+
13
+ こういう「ログファイルをオープンしっぱなしで書く方式」じゃなくて、「ログを書く都度、オープン、書き込み、クローズ」を繰り返している場合(オーバーヘッドが大きいので普通はしないが、大量にログを書くことが絶対にあり得ないプログラムならあるかも)は、オープン時点で`aaa.log`と言う名前のファイルに書きますので、HUPを送ったり再起動しなくてよいわけです。
14
14
 
15
15
  デーモンによっては他にも「`HUP`を受けると、設定ファイルを読み直す機能」があったりします。これも、そういう仕様のプログラムかどうかを確認する必要があります。
16
16