ほっしーの技術ネタ備忘録

技術ネタの備忘録です。基本的に私が忘れないためのものです。他の人の役にも立つといいなぁ。

daemon コマンドでコンソールログを残す方法

以前の記事で、 daemon コマンドを使うとシェルスクリプトとかを簡単に デーモンとして常時稼働させられるねーこれ便利ねーみたいな話を書きました。

認証エラーログを見て ipfw で ban するやつ - ほっしーの技術ネタ備忘録

そのデーモン化したいプログラムから stdout とかに出力したデータを ファイルに残しておく話です。

やり方は簡単で daemon の引数に -o /var/log/hoge_console.log とか書くだけ。 簡単ですね。

(ちゃんと)ログローテートもする

ただ、これだとログファイルが延々と増え続けて死にます(ストレージが)。 …いやイマドキなら死なないかな?

そんなときに使うのはもちろん、 newsyslog ですね。 /etc とか見てると、イマドキは .dディレクトリに設定ファイルを書くのが主流っぽいですね?

という訳で、 /usr/local/etc/newsyslog.conf.d/ に適当なファイル名+ .conf で設定ファイルを書きます。 こんな1行。

/var/log/hoge_console.log root:wheel 644 10 100 * CEXp /var/run/hoge.pid

先頭はさっき daemon-o に渡したファイル名。たぶんフルパスじゃないと死にそう。

で、ポイントになるのはオプション CEXp の後ろに daemon の PID ファイル名を書くこと。 これでローテートを行うときに SIGHUP を送ってくれます。

なので、対応するように daemon の引数には -H -P /var/run/hoge.pid を追加します。 -H を付けると daemonSIGHUP を受け取ったときにこのファイルを開きなおします。 あと、似た引数で -p だと子プロセス( daemon から起動する方)の PID が書かれるので間違えないこと。

間違うとローテートしてからのログが消滅したりして悲しいことになります。