2012-03-29 10 views
5

Estoy ejecutando un servidor 3.2.0 cerebrito 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 mata y volver a empezar: -cherrypy/dev/urandom (o equivalente) no encontrado - error

[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 siguiente fragmento de código que sugiere que hay un retroceso en random.random en caso de cherrypy no es capaz de leer /dev/urandom, pero no parece estar cayendo de nuevo en ella.

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 presenta 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 es capaz de leer /dev/urandom, el siguiente fragmento de código está trabajando muy bien: -

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

tengo dos preguntas: -

  1. ¿Por qué es cherrypy error de tiro no se han aplicado cuando soy capaz de leer bits aleatorios de/dev/urandom
  2. ¿Por qué no _cpcompact.py la ejecución de la parte excepto cuando se está levantando os.pyNotImplementedError.
+0

hace ' python -c "import os; imprimir os.urandom (5) "' ¿trabajo? – tMC

+0

lamentablemente, lo hace, mientras que cherrypy dice/dev/urandom no implementado! – haltTm

+0

¿Tal vez los permisos están arruinados en alguna parte? – sdolan

Respuesta

4

Esto tampoco es una respuesta, sin embargo, en mi experiencia, este NotImplementedError es erróneo pero aparece cuando 'demasiados archivos' están abiertos los errores comienzan a aparecer después de un multiprocesamiento Los procesos comienzan a arrojar una excepción no detectada, que se deja colgando para siempre en los hilos secundarios o procesos secundarios.

Me gustaría empezar la depuración de más arriba en la pila y ver si hay están enterrados o excepciones silenciosas lanzadas por un proceso

He aquí un ejemplo de mi seguimiento de la pila cuando comienzo 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 producido, finalmente ... el error/urandom no encontrado imlp

1

Esta no es una respuesta, pero tal vez usted podría poner un poco de código de depuración en os.py (No me puedo imaginar que impactaría cualquier otro programa usando import os pero vale la pena recordar su 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.)

+0

Una cosa que podemos concluir es que es 'OSError' o' IOError'. ¿Eso arroja alguna luz sobre el tipo de error? Compartiré los resultados contigo cuando ocurra el siguiente error. Otra preocupación importante es, por qué '_cpcompat.py' no está ejecutando la parte except, es decir,' import random ... ' – haltTm

+0

la excepción' OSError' o 'IOError' se puede usar para representar cualquier número de errores del sistema. El objeto de excepción que se genera contiene el errno específico que realmente sería útil (permiso denegado, archivo no encontrado, identificador no abierto para lectura, etc.). Eso es lo que se necesita capturar para entender mejor lo que está sucediendo. – tMC

+0

¿Puede ayudarme con la versión de Python 2.5 de 'excepto (OSError, IOError) como Err'? En este momento, estoy haciendo 'excepto Exception, e:' en su lugar, que debería servir para el mismo propósito, supongo. – haltTm

0

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

mknod -m 644/dev/c aleatorio 1 8

mknod -m 644/dev/urandom c 1 9

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

+0

En mi sistema, el mod es 666. –

Cuestiones relacionadas