ファイルディスクリプタの罠

Zakimi::Blog様の記事に次の一節がありました。

この違いは何だろう?。とりあえず、削除できたのでOKとするか(^^;)。

丁度同じタイミングで職場で同じような質問がありましたので覚書。

ファイルディスクリプタの存在

この現象はUNIX系OSに識別子として存在するファイルディスクリプタの使用上限値に依存するものです。一般的にはユーザ毎に1,024という数字を与えます。この数字がrmコマンド等の処理で一度に扱えるファイルの上限数となります。

間接処理を用いた制限回避

しかしログファイルなどを短い間隔で取得していくとファイルの数は瞬く間に増えていきます。その場合にはfindコマンド等で扱うファイルを指定してやるとこの上限値を回避できます。これはfindコマンドの-execオプションが検索対象として出力されたファイルを1件毎に処理していくという機能を利用したものです。

% find . search_condition -exec rm -f {} ;

※ 上記の例は検索条件search_conditionにマッチした出力に対してrmコマンドを実行しています。

また対象ファイルをリストアップした中間ファイルを作成する事でもファイル数の上限を回避する事ができます。リストファイルに対して次のようなコマンドを入力すれば実現できるでしょう。

% sed 's/^/rm -f /g' list_file > list_file.sh

※ 上記の例はファイルリストから作った中間ファイルlist_fileに対してrmコマンドを挿入しています。

この様に間接的な処理を挟む事によって上限数を回避する事ができます。

システムパラメタを操作して制限値を変更する

前例とは逆の発想としてシステムのカーネルパラメタを変更するという方法もあります。しかしこの方法については各OSによって方法が異なりますので此処では触れません。

各OSのリファレンスを参照してください。

「ファイルディスクリプタの罠」への2件のフィードバック

  1. そうだったのか。(こんばんは)
    なるほど、なるほど、分かりやすい解説をありがとうございました。

    あと、中間ファイルを作る案も目から鱗でした。中間ファイルだと出力した一覧を目でチェックして削除するファイルと削除しないファイルが簡単に判断できるので、 -i オプションより便利かも。

    大変、勉強になりました。

  2. >zRyuさん

    コメント有難うございます。参考になって何よりでした。
    因みに中間ファイルを作成するような場合にはディレクトリやコマンドの権限関係をチェックした方が良いかも知れませんです。

    当の私が良く引っかかっていますので(笑)

コメントは停止中です。