【问题标题】:cherrypy /dev/urandom (or equivalent) not found -- error找不到cherrypy /dev/urandom(或等效项)——错误
【发布时间】:2012-03-29 14:42:10
【问题描述】:

我正在运行一个带有 Python 2.5.1 的cherrypy 3.2.0 服务器,它每隔几天就会在来自 UI 的任何指令上出现以下错误,直到它被杀死并重新启动:-

[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 有以下代码表明random.random 有一个后备,以防cherrypy 无法读取/dev/urandom,但似乎没有后备。

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的代码sn-p,与上下文相关:-

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

同时当cherrypy无法读取/dev/urandom时,以下代码sn-p工作正常:-

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

我有两个问题:-

  1. 为什么当我能够从 /dev/urandom 读取随机位时,cherrypy throwing not implemented 错误
  2. 为什么os.py 提高NotImplementedError_cpcompact.py 不执行except 部分。

【问题讨论】:

  • python -c "import os; print os.urandom(5)" 工作吗?
  • 可悲的是,它确实如此,而cherrypy 说 /dev/urandom 没有实现!
  • 也许权限被搞砸了?
  • @haltTm:我不知道,我只是在扔东西。
  • 我敢打赌,如果您将一些调试代码放入 os.py 以写入 syslog(或其他文件),这将是非常有帮助的。

标签: python session random cherrypy


【解决方案1】:

这也不是一个答案,但是,根据我的经验,这个 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 not found imlp 错误

【讨论】:

    【解决方案2】:

    这不是答案,但也许您可以将一些调试代码放入os.py(我无法想象它会影响使用import os 的任何其他程序,但值得记住它的自定义)

    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
    

    希望这能准确地告诉您错误是什么。 (您当然可以用写入文件等替换 syslog)

    【讨论】:

    • 我们可以得出的结论是,它是OSErrorIOError。这对错误的类型有任何启示吗?下次发生错误时,我将与您分享结果。另一个重要的问题是,为什么_cpcompat.py没有执行except部分,即import random ...
    • OSErrorIOError 异常可用于表示任何数字系统错误。引发的异常对象包含真正有用的特定 errno(权限被拒绝、文件未找到、句柄未打开以供读取等)。这就是需要捕捉的内容,以便更好地了解正在发生的事情。
    • 你能帮我解决except(OSError,IOError) as Err的python 2.5版本吗?现在,我正在做except Exception,e:,我想这应该可以达到同样的目的。
    • error: (24, 'Too many open files')/proc/cherrypy_pid/fd/ 显示 1049 个文件已打开。这是由于我的日志记录模块的一些错误。顺便说一句,ulimit -n 为我返回 10240。我想知道它可以打开的文件数量是否有一个进程明智的限制?
    • @haltTm 这可能会有所帮助:docs.python.org/library/resource.html 否则,您可以在/etc/security/limits.conf 中提高系统范围内的限制。但请记住,如果软件中存在打开但从不关闭它们的错误,则只会延长它在句柄用完之前的运行时间。
    【解决方案3】:

    如果您的系统尚未创建 /dev/random 和 /dev/urandom,可以使用以下命令创建它们:

    mknod -m 644 /dev/random c 1 8

    mknod -m 644 /dev/urandom c 1 9

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

    【讨论】:

    • 在我的系统上,mod 是 666。
    猜你喜欢
    • 2013-02-02
    • 2016-04-03
    • 2011-11-03
    • 2017-11-17
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 2021-05-19
    相关资源
    最近更新 更多