FreeBSDでtracを動かそうとしたときに起きたエラーについて

FreeBSDでtracを動かそうとしたときに起きたエラーについて。

ホームディレクトリが存在しないユーザでpythonを実行するとエラーになる件。pythonのことをよくしらないけど、厳密にはpythonのエラーではなくeggのエラー?になるような気がする。

以下エラーメッセージ


shell> sudo -u www python
Python 2.6.6 (r266:84292, Mar 16 2011, 02:49:37)
[GCC 4.2.1 20070719  [FreeBSD]] on freebsd8
Type "help", "copyright", "credits" or "license" for more information.
>>> import MySQLdb
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "build/bdist.freebsd-8.2-RELEASE-amd64/egg/MySQLdb/__init__.py", line 19, in <module>
File "build/bdist.freebsd-8.2-RELEASE-amd64/egg/_mysql.py", line 7, in <module>
File "build/bdist.freebsd-8.2-RELEASE-amd64/egg/_mysql.py", line 4, in __bootstrap__
File "build/bdist.freebsd-8.2-RELEASE-amd64/egg/pkg_resources.py", line 882, in resource_filename
File "build/bdist.freebsd-8.2-RELEASE-amd64/egg/pkg_resources.py", line 1351, in get_resource_filename
File "build/bdist.freebsd-8.2-RELEASE-amd64/egg/pkg_resources.py", line 1373, in _extract_resource
File "build/bdist.freebsd-8.2-RELEASE-amd64/egg/pkg_resources.py", line 962, in get_cache_path
File "build/bdist.freebsd-8.2-RELEASE-amd64/egg/pkg_resources.py", line 928, in extraction_error
pkg_resources.ExtractionError: Can't extract file(s) to egg cache

The following error occurred while trying to extract file(s) to the Python egg
cache:

[Errno 17] File exists: '/nonexistent'

The Python egg cache directory is currently set to:

/nonexistent/.python-eggs

Perhaps your account does not have write access to this directory?  You can
change the cache directory by setting the PYTHON_EGG_CACHE environment
variable to point to an accessible directory.

このエラーは、www, svnといったホームディレクトリを持たないユーザがpythonを使ったスクリプトを実行したときに遭遇する。 たとえばtrac-adminをwwwユーザで実行したとき、またsubversionでコミット時のフック、hooks/post-commitのところでもエラーがでてたりする。 今回はpost-commitのあとtrac-svn-hookを呼び出していたので、ログがtrac/log/svn-hooks-testrep.logにエラーが出ていた。コレに書いてあるだけで他にはwarningとか出ないのでなかなか気づかなかった。


shell> tail svn-hooks-testrep.log

Changeset 4 added
Traceback (most recent call last):
File "/usr/local/lib/python2.6/logging/handlers.py", line 796, in emit
self.socket.send(msg)
error: [Errno 40] Message too long
TracError: Unsupported database type "mysql"
FAILED: see the Trac log

同様にwwwユーザでtrac-adminを走らせてもエラーがでる。


> sudo -u www trac-admin /path/to/trac repository resync testrep
Traceback (most recent call last):
File "/usr/local/lib/python2.6/logging/handlers.py", line 796, in emit
self.socket.send(msg)
error: [Errno 40] Message too long
TracError: Unsupported database type "mysql"

で、解決方法は・・・、一筋縄ではいかない。 それぞれのユーザにホームディレクトリを持たせるのが一番手っ取り早い。でもこれらのユーザをnisで管理してたらそこも一斉に書き換わっちゃう。 いらないところは最小限に、ってことで、該当するホストに/nonexistentフォルダを作ってみる。いいのかな、こんなやりかたで・・・。


shell> sudo mkdir /nonexistent
shell> sudo chmod 777 /nonexistent/

ひとまずこれで動いた。 おしまい。

「FreeBSDでtracを動かそうとしたときに起きたエラーについて」への2件のフィードバック

  1. 他の件でたまたまeggのキャッシュを指定するケースがあったのでメモメモ。どうやらos.environ[‘PYTHON_EGG_CACHE’]の変数で指定できるらしい。

    import os

    os.environ[‘TRAC_ENV_PARENT_DIR’] = ‘/usr/local/etc/trac/’
    os.environ[‘PYTHON_EGG_CACHE’] = ‘/var/www/.python-eggs’

    import trac.web.main
    application = trac.web.main.dispatch_request

コメントを残す