2012-03-29 14 views
5

Python 2.5.1でcherrypy 3.2.0サーバを実行していますが、数日おきにUIからの指示が殺されるまで再開始しました: -cherrypy/dev/urandom(または同等のもの)が見つかりません - エラー

[29/Mar/2012:06:37:57] HTTP Traceback (most recent call last): 
File "/usr/lib/python2.5/site-packages/CherryPy-3.2.0-py2.5.egg/cherrypy/_cprequest.py", line 636, in respond 
File "/usr/lib/python2.5/site-packages/CherryPy-3.2.0-py2.5.egg/cherrypy/_cprequest.py", line 97, in run 
File "/usr/lib/python2.5/site-packages/CherryPy-3.2.0-py2.5.egg/cherrypy/_cprequest.py", line 57, in __call__ 
File "/usr/lib/python2.5/site-packages/CherryPy-3.2.0-py2.5.egg/cherrypy/lib/sessions.py", line 757, in init 
File "/usr/lib/python2.5/site-packages/CherryPy-3.2.0-py2.5.egg/cherrypy/lib/sessions.py", line 162, in __init__ 
File "/usr/lib/python2.5/site-packages/CherryPy-3.2.0-py2.5.egg/cherrypy/lib/sessions.py", line 190, in _regenerate 
File "/usr/lib/python2.5/site-packages/CherryPy-3.2.0-py2.5.egg/cherrypy/lib/sessions.py", line 204, in generate_id 
File "/usr/lib/python2.5/site-packages/CherryPy-3.2.0-py2.5.egg/cherrypy/_cpcompat.py", line 264, in random20 
File "/usr/lib/python2.5/os.py", line 733, in urandom 
NotImplementedError: /dev/urandom (or equivalent) not found 

_cpcompat.py/dev/urandomを読み取ることができませんが、それに戻って落下していないようrandom.random上のフォールバックはケースCherryPyに中があることを示唆しているコードの一部を以下ました。

try: 
    os.urandom(20) 
    import binascii 
    def random20(): 
     return binascii.hexlify(os.urandom(20)).decode('ascii') 

except (AttributeError, NotImplementedError): 
    import random 
    # os.urandom not available until Python 2.4. Fall back to random.random. 
    def random20(): 
     return sha('%s' % random.random()).hexdigest() 

次のコンテキスト内の関連するos.pyからコードスニペットです: - CherryPyには/dev/urandomを読み取ることができません、次のコードスニペットが正常に動作していると同時に

if not _exists("urandom"):

def urandom(n): 
     """urandom(n) -> str 

     Return a string of n random bytes suitable for cryptographic use. 

     """ 
     try: 
      _urandomfd = open("/dev/urandom", O_RDONLY) 
     except (OSError, IOError): 
      raise NotImplementedError("/dev/urandom (or equivalent) not found") 
     bytes = "" 
     while len(bytes) < n: 
      bytes += read(_urandomfd, n - len(bytes)) 
     close(_urandomfd) 
     return bytes 

: -

python -c "import os;fd = open('/dev/urandom', 'r');print fd.read(5);fd.close()"

私は2つの質問があります: -

  1. なぜCherryPyにos.pyNotImplementedErrorを上げているとき_cpcompact.pyは一部を除いて実行していないのはなぜでは、/ dev/urandomの
  2. からランダムビットを読み取ることができていないときは、実装エラーを投げます。
+0

は 'を行いますpython -c "import os; print os.urandom(5) "'仕事? – tMC

+0

悲しいことですが、cherrypyは/ dev/urandomは実装されていません! – haltTm

+0

おそらく許可がどこかで壊れていますか? – sdolan

答えて

4

私の経験では、このNotImplementedErrorは間違っていますが、「あまりにも多くのファイル」が開いているエラーが表示されると表示されますマルチプロセスの後でプロセスはキャッチされていない例外を投げ始め、子スレッドまたは子プロセスに永遠にぶら下がります。私はこのエラー

Exception in thread Plotter: 
Traceback (most recent call last): 
    File "threading.pyc", line 532, in __bootstrap_inner 
    File "plotters/edge.pyc", line 459, in run 
    AttributeError: 'error' object has no attribute 'error' 

OSError: [Errno 24] Too many open files 
    File "multiprocessing/connection.pyc", line 150, in Client 
    File "multiprocessing/connection.pyc", line 370, in deliver_challenge 
    None 
    File "os.pyc", line 756, in urandom 
NotImplementedError: /dev/urandom (or equivalent) not found 

私を見始めるとき

私はスタックまで、さらにデバッグを開始し、そこに埋葬またはサイレント例外は、ここでの処理によって

を投げているかどうかを確認でしょうが、私のスタックトレースの例ですAttributeErrorが生成されました.../urandomが見つかりませんでしたimlpエラー

1

これが答えではありませんが、多分あなたは

if not _exists("urandom"): 
    def urandom(n): 
     """urandom(n) -> str 

     Return a string of n random bytes suitable for cryptographic use. 

     """ 
     try: 
      _urandomfd = open("/dev/urandom", O_RDONLY) 
     # debug changes 
     except (OSError, IOError) as Err: 
      import syslog 
      syslog.syslog(repr(Err)) 
     # /debug 
      raise NotImplementedError("/dev/urandom (or equivalent) not found") 
     bytes = "" 
     while len(bytes) < n: 
      bytes += read(_urandomfd, n - len(bytes)) 
     close(_urandomfd) 
     return bytes 
(私はそれがそのカスタマイズを覚える import osが、その価値を使用して、他のプログラムに影響を与えるだろうと想像することはできません) os.pyにいくつかのデバッグコードを入れることができます

うまくいけば、それはエラーが何であるかを正確に教えてくれるでしょう。 (あなたはもちろんsyslogをファイルに書き込むだけで置き換えることができます)

+0

私たちが結論づけることの1つは、OSErrorまたはIOErrorです。それはエラーのようなものにどんな光を投げるのだろうか?次にエラーが発生したら、結果をあなたと共有します。 '_cpcompat.py'がexcept部分、つまり' import random ... 'を実行しない理由はもう一つ重要です。 – haltTm

+0

OSErrorまたはIOError例外を使用して、数値システムエラーを表すことができます。呼び出される例外オブジェクトには、実際に有用な特定のerrnoが含まれています(アクセス権が拒否されていないか、ファイルが見つからないか、読み込みができないなど)。何が起こっているのかをよりよく理解するために捕らえる必要があること。 – tMC

+0

Python 2.5バージョンの 'except(OSError、IOError)as Err'を手伝ってもらえますか?今、私は '例外を除いて、e:'をやっています。代わりに同じ目的を果たすべきです。 – haltTm

0

システムに/ dev/randomと/ dev/urandomが既に作成されていない場合は、次のコマンドで作成できます。

はmknod -m 644/devの/ランダムC 1~8

はmknod -m 644に/ dev/urandomのC 1~9

のchownルート:ルートは/ dev /ランダムに/ dev/urandomの

+0

私のシステムでは、modは666です。 –

関連する問題