2009年10月8日木曜日

(Solaris) chown -Rしたら、Too many open files ~ えっ?!

Solaris9でpkgsrcな環境にて、databases/postgresql82-clientを、bmake installしたら、chownしているときに、Signal 11となって、インストールが失敗しました。



どうも、こんな感じでして・・・



# chown -R root:root なんとかかんとか
chown: .: Too many open files
~たくさん出力されるので省略~
chown: .: Too many open files
chown: getcwd: Too many open files



というわけで、chownがおかしいらしいのです。



trussをつけて実行してみると、ディレクトリを探索しているときに、途中から無限ループになっていました。



たとえば、trussのログからchdirだけ抜き出してみると



chdir("引数で指定したディレクトリ") = 0
chdir("..")                                     = 0
chdir("..")                                     = 0
chdir("別のサブディレクトリ")                   = 0
chdir("..")                                     = 0
chdir("上と同じ")                               = 0
chdir("..")                                     = 0
chdir("上と同じ"                                = 0
chdir("..")                                     = 0
~繰り返し~



という感じになっていて、



chown -R root:root /a/b/c/d/e



を実行したのに、目標からずれた、/a/b/c/x のあたりをウロウロしていました。



しかも、/a/b/c/x の中で、



chown("ファイル", 0, 0)                = 0



なんてことをやっているので、おもいっきり誤爆してる。オイ、コラ、ナニヤッテンダ、コノヤロー(怒)なんです。



なんで、こんなことになってしまうのか、理解不能・・・



これは、とんでもないバグだと思います。



気になるといえば、/a/b のところが、実際は、シンボリックリンクになっていて、別のところを差している、その先はNFSになっている、・・・ということくらい。



それにしてもなぁ・・・



chownのソースコードはないし、結局、このchown -Rの挙動はわけわかんなくて、pkgsrcでインストールしたgchownを使って、回避しました。





いったいどこでchownを実行しているのか、ソースコード中のMakefileなど、必死に探したけど、見つからず。



うーん、こんなところにあったか



/usr/pkgsrc/databases/postgresql82-client/Makefile



post-install:
        cd ${WRKSRC}/doc; for file in                                   \
                FAQ* KNOWN_BUGS MISSING_FEATURES README.* TODO          \
                bug.template;                                           \
        do                                                              \
                ${INSTALL_DATA} $$file ${DESTDIR}${PG_DOC_DIR}/$$file;  \
        done
        cp -R ${WRKSRC}/doc/TODO.detail ${DESTDIR}${PG_DOC_DIR}
        chown -R ${DOCOWN}:${DOCGRP} ${DESTDIR}${PG_DOC_DIR}/TODO.detail



0 件のコメント:

コメントを投稿