2009-07-07 17 views
5

Tengo un programa web.py simple para cargar datos. En el servidor no quiero instalar Apache ni ningún servidor web.Ejecute web.py como daemon

trato de ponerlo como un servicio de fondo con http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/

Y subclases: (de 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) 

Sin embargo, el software web.py se carga (es decir: el servicio sin escuchar)

Si lo llamo directamente (es decir: No usando el código de daemon) funciona bien.

Respuesta

5

Finalmente encuentro el problema.

web.py aceptar de línea de comandos el número de puerto opcional:

python code.py 80 

Y el guión también toma de entrada de la línea de comandos:

python WebServer start 

continuación web.py tratan de utilizar "iniciar" como número de puerto y falla. No veo el error porque estaba en el fundamento.

puedo solucionar esto con un mini-Hack:

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

No creo que le esté diciendo al daemon que se ejecute. Necesita crear una instancia de un objeto MyDaemon y llamar a o.run(). Parece que WebService solo inicia y detiene la interfaz de servicio a su aplicación web, no la aplicación web real en sí.

+0

Actualizo la pregunta para mostrar que cuando la llamada "inicio" se llama el método "ejecutar". – mamcx

+0

Todavía no puedo decir cómo se conecta el servicio (desde WebService) a MyDaemon, a menos que sea implícito. – mcandre

+0

Oh, mi error :(. Me olvido de poner el nombre de clase correcto (kittie malo copiar/pegar!) – mamcx

4

puede iniciar el web.py mediante el uso de este comando

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

En lugar de sobrescribir el segundo argumento como el que escribió aquí:

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

puede eliminar el segundo argumento en 'start | restart', como este:

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

De esta manera, la webpy recibirá todos los argumentos que haya pasado desde la línea de comandos, excepto el controlador daemon. Entonces puede ejecutar simplemente:

python WebServer start 8080