pid1 に割り込む奴

お久しぶりです。

本日の一言

だいぶ涼しくなりましたね。私は冬の方が好きです。

こういう光景も冬ならではですよね。

最近、「イラスト統一祭」っていう面白い祭りやってました。 その中で神曲見つけました。

pid1 に割り込みたくなる時もある

とはどういうことか。
Docker では、PID1 プロセスの標準出力をそのままログとして保存する仕組みがあります。 しかし、PID1 以外のソフトウェア(例えば pid1 がシェルスクリプトであり、スクリプト中に本来必要なプログラムを動作させる時)のログを残すにはどうすれば良いでしょうか

proc を使う

/procは仮想的なファイルです。実在しません。
proc は linux 特有の仕組みです。proc ディレクトリの中にある数字のディレクトリは、pid となっています。

中身にあるもの: environ

environ というファイルには、環境変数が表示されます。
環境変数にパスワード設定すると、ルートユーザーから容易にバレるわけです。まぁルートユーザーなんでね。

中身にあるもの: fd

fd というディレクトリですが、正式名称はファイルディスクリプターというそうです。
中を開くとこれまた数字のディレクトリがたくさんあります。

ファイルディスクリプター

よく、0 は標準入力、1 は標準出力、2 はエラー出力などと聞きます。 ディレクトリの数字はそれです。

しかし、実際のソフトウェアではその常識は通用しません。

l-wx------ 1 www-data www-data 64 Sep 23 17:20 2 -> /var/log/nginx/error.log
l-wx------ 1 www-data www-data 64 Sep 23 17:20 3 -> /var/log/nginx/error.log
l-wx------ 1 www-data www-data 64 Sep 23 17:20 4 -> /var/log/nginx/access.log

nginx だと、2 が error.log へ、4 は access.log へと、自由に設定できます。

docker のロガー

docker のロガーは、pid1 の fd1 をログとして残すそうです。

まとめ

コンテナ内で

echo hello > /proc/1/fd/1

とすれば、docker のログにhelloという文字列が残る