Ruby でオープンなファイルオブジェクトたちを取得する方法

Published: 2021/12/3


背景

Ruby で Fileopen する際には、基本的に block 構文で自動クローズをしながら実行したりはするが、 画像処理ライブラリと組合わせるなどする際に明示的に close をする必要がある場合などがあり、 その際に close し忘れで Too many open files @ rb_sysopen - big_file (Errno::EMFILE) などのエラーが発生してしまったときに、 実際に今現在にオープンな File の一覧を取得したくなったので、その時に行った調査方法についてのメモ。

方法

ObjectSpace.each_object(IO).reject(&:closed?)

ruby は ObjectSpace からすべての object を取得できるので、それを利用して IO のオブジェクトのうち、 closed? でないものを取得することで、今実際にファイルを開いているオブジェクトの一覧を取得できる。

これを、怪しい箇所の前後に入れておいて .size などを出力することによって、どこで open なファイルが増えたのか、を確認していくことで、デバッグができることを確認した。


Tags: ruby
Next: Elasticsearch の bulk リクエストにおいて、`join` データのために routing を指定する方法
Prev: POSIX における環境変数の仕様について