file descriptor とは何か? I/O のための番号付きハンドル
file descriptor は、オペレーティングシステムがプロセス内の開いているファイル、ソケット、ストリームのハンドルとして使う小さな整数です。
内部では、プロセス内のすべての開いているファイルやストリームは、file descriptor と呼ばれる番号で参照されます。最もよく出会う 3 つは 0、1、2、すなわち stdin、stdout、stderr です。descriptor を理解すると、CI スクリプトのあちこちに現れる 2>&1 のような一見難解なリダイレクトが説明できます。
file descriptor とは
プロセスがファイルを開くと、カーネルはそれを識別する小さな整数を返します。プロセスはすべての read や write にその番号を使います。descriptor はプロセスごとなので、同じ番号が異なるプログラムでは異なるものを意味します。
3 つの標準 descriptor
- 0 は stdin、入力ストリーム。
- 1 は stdout、通常の出力ストリーム。
- 2 は stderr、エラーストリーム。
番号によるリダイレクト
ストリームは descriptor 番号でリダイレクトします。2> errors.log は descriptor 2 (stderr) をファイルに送ります。2>&1 は descriptor 2 を descriptor 1 が現在指している場所に向け、ストリームを統合します。
より高い descriptor
0、1、2 を超えて、プロセスはさらに多くのファイルを開き、descriptor 3、4 などを得られます。高度なスクリプトは追加の descriptor を開くことがありますが、ほとんどの CI 作業は標準の 3 つだけを扱います。
CI における file descriptor
CI でログを read し write することは、すべて descriptor の作業です。> out.log 2>&1 が stdout をファイルにリダイレクトし、次に stderr を同じ場所に向けることを知っておくのが、build ステップから完全なログをキャプチャする鍵です。
managed runner でのストリーム処理
Latchkey runner はステップの stdout と stderr を自動的に job ログに接続します。ステップの完全な出力をファイルにも必要とするときは、標準の descriptor リダイレクトがローカルとまったく同じように機能します。
重要なポイント
- file descriptor は、開いているファイルやストリームの数値ハンドルです。
- descriptor 0、1、2 は stdin、stdout、stderr です。
2>&1のようなリダイレクトはこれらの番号を操作して CI ログをルーティングします。