2009-07-07 173 views
5

我有一个简单的web.py程序来加载数据。在服务器中,我不想安装Apache或任何网络服务器。运行web.py作为守护进程

我试图把它作为后台服务与http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/

而子类: (从http://www.jejik.com/files/examples/daemon.py

class Daemon: 
    def start(self): 
     """ 
     Start the daemon 
     """ 
     ... PID CHECKS.... 

     # Start the daemon 
     self.daemonize() 
     self.run() 
#My code 
class WebService(Daemon): 
     def run(self): 
      app.run() 

if __name__ == "__main__": 
    if DEBUG: 
     app.run() 
    else: 
     service = WebService(os.path.join(DIR_ACTUAL,'ElAdministrador.pid')) 
     if len(sys.argv) == 2: 
      if 'start' == sys.argv[1]: 
       service.start() 
      elif 'stop' == sys.argv[1]: 
       service.stop() 
      elif 'restart' == sys.argv[1]: 
       service.restart() 
      else: 
       print "Unknown command" 
       sys.exit(2) 
      sys.exit(0) 
     else: 
      print "usage: %s start|stop|restart" % sys.argv[0] 
      sys.exit(2) 

然而,web.py软件无法加载(即:服务没有听)

如果我直接调用它(即:不使用守护程序代码)工作正常。

回答

5

我终于找到了问题。

的web.py通过命令行接受可选的端口号:

python code.py 80 

和脚本还需要在命令行输入:

python WebServer start 

然后web.py尝试使用“开始”作为端口号并失败。我没有看到这个错误,因为它是免费的。

我解决这个问题有迷你黑客:

if __name__ == "__main__": 
    if DEBUG: 
     app.run() 
    else: 
     service = WebService(os.path.join(DIR_ACTUAL,'ElAdministrador.pid')) 
     if len(sys.argv) == 2: 
      if 'start' == sys.argv[1]: 
       sys.argv[1] = '8080' 
       service.start() 
0

我不认为你在告诉守护进程运行。你需要实例化一个MyDaemon对象并调用o.run()。它看起来像WebService只启动和停止服务接口到您的Web应用程序,而不是实际的Web应用程序本身。

+0

我更新了问题,以显示调用“start”时称为“run”方法。 – mamcx 2009-07-07 17:18:31

4

您可以使用此命令

/usr/bin/python index.py > log.txt 2>&1 & 
0

而不是覆盖第二个参数像你这样写到这里开始web.py:

if __name__ == "__main__": 
    if DEBUG: 
     app.run() 
    else: 
     service = WebService(os.path.join(DIR_ACTUAL,'ElAdministrador.pid')) 
     if len(sys.argv) == 2: 
      if 'start' == sys.argv[1]: 
       sys.argv[1] = '8080' 
       service.start() 

你可以删除'start | restart'中的第二个参数,如下:

if __name__ == "__main__": 
    if DEBUG: 
     app.run() 
    else: 
     service = WebService(os.path.join(DIR_ACTUAL,'ElAdministrador.pid')) 
     if len(sys.argv) == 2: 
      if 'start' == sys.argv[1]: 
       delete del sys.argv[1:2] 
       service.start() 

通过这种方式,webpy将接收您从命令行传递的所有参数,但守护进程控制器除外。然后你可以简单地运行:

python WebServer start 8080 
相关问题