cherrypy / dev / urandom (o equivalente) no encontrado – error

Estoy ejecutando un servidor cherrypy 3.2.0 con Python 2.5.1, que da el siguiente error cada pocos días en cualquier instrucción de la interfaz de usuario hasta que se elimina y se reinicia:

[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 tiene el siguiente fragmento de código que sugiere que hay un random.random en random.random en caso de que cherrypy no sea capaz de leer /dev/urandom , pero no parece estar retrocediendo.

 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() 

A continuación se muestra el fragmento de código de os.py , relevante en el contexto:

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 

Al mismo tiempo, cuando cherrypy no puede leer /dev/urandom , el siguiente fragmento de código funciona bien:

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

Tengo dos preguntas:-

  1. ¿Por qué no se implementó el error de lanzamiento de cherrypy cuando puedo leer bits aleatorios de / dev / urandom?
  2. ¿Por qué _cpcompact.py no ejecuta la parte de excepción cuando os.py está generando NotImplementedError ?

Esto tampoco es una respuesta, sin embargo, en mi experiencia, NotImplementedError es errónea, pero aparece cuando “hay demasiados archivos abiertos”. Los errores comienzan a aparecer después de un proceso de multiproceso. .

Comenzaría a depurar más arriba en la stack y vería si hay un proceso de excepciones ocultas o silenciosas.

Aquí hay un ejemplo de mi seguimiento de stack cuando empiezo a ver este error

 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 

Mi AttributeError produjo, eventualmente … el error / urandom not found imlp

Esto no es una respuesta, pero tal vez podrías poner un código de depuración en os.py (no puedo imaginar que afecte a cualquier otro progtwig que use os.py pero vale la pena recordar que está personalizado)

 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 

Esperemos que eso te diga exactamente cuál es el error. (Por supuesto, puede reemplazar syslog simplemente escribiendo en un archivo, etc.)

Si su sistema no tiene / dev / random y / dev / urandom ya creados, se pueden crear con los siguientes comandos:

mknod -m 644 / dev / random c 1 8

mknod -m 644 / dev / urandom c 1 9

chown root: root / dev / random / dev / urandom