【问题标题】:Cherrypy Daemon shutdown failsCherrypy 守护进程关闭失败
【发布时间】:2014-09-01 22:02:18
【问题描述】:

我已经关注了 Cherrypy 守护进程 webapp 框架 Deploying CherryPy (daemon),这很棒。但我遇到了关机问题。

有问题的服务器正在使用端口 8082。当关闭来自 init.d 脚本时,它会命中 webapp-cherryd 等效项,然后引发错误。 XXX@mgmtdebian7:/etc/init.d# ./XXX 停止

[11/Jul/2014:09:39:25] ENGINE Listening for SIGHUP.
[11/Jul/2014:09:39:25] ENGINE Listening for SIGTERM.
[11/Jul/2014:09:39:25] ENGINE Listening for SIGUSR1.
[11/Jul/2014:09:39:25] ENGINE Bus STARTING
[11/Jul/2014:09:39:25] ENGINE Started monitor thread 'Autoreloader'.
[11/Jul/2014:09:39:25] ENGINE Started monitor thread '_TimeoutMonitor'.
[11/Jul/2014:09:39:30] ENGINE Error in 'start' listener <bound method Server.start of <cherrypy._cpserver.Server object at 0xe60e10>>
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/CherryPy-3.2.4-py2.7.egg/cherrypy/process/wspbus.py", line 197, in publish
    output.append(listener(*args, **kwargs))
  File "/usr/local/lib/python2.7/dist-packages/CherryPy-3.2.4-py2.7.egg/cherrypy/_cpserver.py", line 151, in start
    ServerAdapter.start(self)
  File "/usr/local/lib/python2.7/dist-packages/CherryPy-3.2.4-py2.7.egg/cherrypy/process/servers.py", line 168, in start
    wait_for_free_port(*self.bind_addr)
  File "/usr/local/lib/python2.7/dist-packages/CherryPy-3.2.4-py2.7.egg/cherrypy/process/servers.py", line 412, in wait_for_free_port
    raise IOError("Port %r not free on %r" % (port, host))
IOError: Port 8080 not free on '127.0.0.1'

[11/Jul/2014:09:39:30] ENGINE Shutting down due to error in start listener:
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/CherryPy-3.2.4-py2.7.egg/cherrypy/process/wspbus.py", line 235, in start
    self.publish('start')
  File "/usr/local/lib/python2.7/dist-packages/CherryPy-3.2.4-py2.7.egg/cherrypy/process/wspbus.py", line 215, in publish
    raise exc
ChannelFailures: IOError("Port 8080 not free on '127.0.0.1'",)

[11/Jul/2014:09:39:30] ENGINE Bus STOPPING
[11/Jul/2014:09:39:30] ENGINE HTTP Server cherrypy._cpwsgi_server.CPWSGIServer(('127.0.0.1', 8080)) already shut down
[11/Jul/2014:09:39:30] ENGINE Stopped thread '_TimeoutMonitor'.
[11/Jul/2014:09:39:30] ENGINE Stopped thread 'Autoreloader'.
[11/Jul/2014:09:39:30] ENGINE Bus STOPPED
[11/Jul/2014:09:39:30] ENGINE Bus EXITING
[11/Jul/2014:09:39:30] ENGINE Bus EXITED
XXX@mgmtdebian7:/etc/init.d# 

从我到目前为止所做的冲浪中,我相信该服务正在尝试重新启动以响应 SIGHUP 信号,并且它正在使用默认端口 8080(这不是而且不应该是免费的) 并因此失败。

这会让服务继续运行——这不是我们想要的......

顺便说一句,我将端口设置为 8082 的配置在我加载的模块内 - 而不是在配置文件中。

感谢任何期待的指点。

【问题讨论】:

    标签: daemon cherrypy shutdown


    【解决方案1】:

    正如日志中明确指出的那样,CherryPy 正在尝试在 127.0.0.1:8080 上启动并在 5 秒后失败。所以你实际上有一个启动失败,很可能是因为在 我的配置中将端口设置为 8082 是在我加载的模块中 - 而不是在配置文件中 你没有正确设置端口CherryPy 使用默认的 8080。

    我还想指出,您不应该在生产中使用Autoreloadercherrypy-webapp-skeleton init.d 脚本设置 production CherryPy environment 已关闭 Autoreloader

    【讨论】:

    • 谢谢。通过更改方法以更紧密地跟踪骨架来使其工作。对我来说,一个学习点是,cherrypy-webapp-skeleton 内部存在不值得深入研究的错综复杂的东西。因此,开始新项目最快的地方就是使用骨架——也许只是剪掉所有应用程序以提供一个“hello world”..
    • @VernonR 很好用。完整的部署本身并不是一件很简单的事情,因此可能需要时间来很好地理解所有方面,并且您可能会在之后多次返回骨架。拿走你现在需要的东西。它也是为 qooxdoo 单页 Web 应用程序制作的,所以如果您做其他类型的前端,则需要进行一些收缩。
    【解决方案2】:

    所以当你这样做时

    cherrypy.tree.graph(app, "/") 
    

    默认情况下,您会在 localhost:8080 上创建一个服务器实例,但在您调用 cherrypy.engine.start() 之前它实际上并没有开始。

    你可能正在做这样的事情

    例如:

        cherrypy.tree.graft(app, "/") # registers a server on localhost:8080
    
        server = cherrypy._cpserver.Server() # registers a second server...
        server.socket_host="0.0.0.0" # ..on 0.0.0.0 ...
        server.socket_port = 5002 # ..with port 5002
        server.thread_pool = 10
        server.subscribe()
    
        cherrypy.engine.start() #starts two server instances
        cherrypy.engine.block()
    

    将导致cherry py启动两个服务器实例,一个在localhost:8080,另一个在5002。

    答案是这样做:

        cherrypy.tree.graft(app, "/")
        cherrypy.server.unsubscribe() # very important gets rid of default.
    
        server = cherrypy._cpserver.Server()
        server.socket_host="0.0.0.0"
        server.socket_port = 5002
        server.thread_pool = 10
        server.subscribe()
    
        cherrypy.engine.start() #now starts only one server instance
        cherrypy.engine.block()
    

    您上面的问题是您正在盯着两台服务器,并且其中只有一个正在崩溃/出错/关闭,因此端口 8080 仍然绑定到本地主机并防止重新启动..

    【讨论】:

      猜你喜欢
      • 2010-11-30
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 2012-10-03
      • 2017-05-06
      • 2016-12-07
      相关资源
      最近更新 更多