2009-09-14 29 views
14

¿Es posible ejecutar un script de Python como servicio en segundo plano en un servidor web? Quiero hacer esto para socket communication.¿Puedo ejecutar un script de Python como servicio?

+0

Es posible, para una respuesta más detallada, proporcione más información: qué sistema operativo usa, desea iniciar el servicio al reiniciar, etc. –

+0

Windows o Unix Enviroment? – dmeister

+0

Piensa en "servidores Unix/Linux", que suelen tener los servidores web. –

Respuesta

8

Puedes convertirlo en un daemon. Hay un PEP para una solución más completa, pero he descubierto que esto funciona bien.

import os, sys 

def become_daemon(our_home_dir='.', out_log='/dev/null', err_log='/dev/null', pidfile='/var/tmp/daemon.pid'): 
    """ Make the current process a daemon. """ 

    try: 
     # First fork 
     try: 
      if os.fork() > 0: 
       sys.exit(0) 
     except OSError, e: 
      sys.stderr.write('fork #1 failed" (%d) %s\n' % (e.errno, e.strerror)) 
      sys.exit(1) 

     os.setsid() 
     os.chdir(our_home_dir) 
     os.umask(0) 

     # Second fork 
     try: 
      pid = os.fork() 
      if pid > 0: 
       # You must write the pid file here. After the exit() 
       # the pid variable is gone. 
       fpid = open(pidfile, 'wb') 
       fpid.write(str(pid)) 
       fpid.close() 
       sys.exit(0) 
     except OSError, e: 
      sys.stderr.write('fork #2 failed" (%d) %s\n' % (e.errno, e.strerror)) 
      sys.exit(1) 

     si = open('/dev/null', 'r') 
     so = open(out_log, 'a+', 0) 
     se = open(err_log, 'a+', 0) 
     os.dup2(si.fileno(), sys.stdin.fileno()) 
     os.dup2(so.fileno(), sys.stdout.fileno()) 
     os.dup2(se.fileno(), sys.stderr.fileno()) 
    except Exception, e: 
     sys.stderr.write(str(e)) 
+0

En el fragmento de código anterior, puedo ver al menos un problema: la presencia de daemon sniffing no está completa antes de intentar iniciar una instancia nueva. – jldupont

+1

olfateando? ¿Quiere decir verificar si el daemon ya se está ejecutando? si es así, esto se hace en un procedimiento diferente antes de llamar al anterior. – Robert

+0

buena demostración, muy divertido! Hay un montón de método para hacer ese python-daemon, un subproceso con llamadas de shell personalizadas (nohup, &), pero esto es muy simple de entender. Agradable :) –

7

Es posible que desee echa un vistazo a Twisted.

+0

Lo he comprobado, y es bastante confuso de entender. Entonces Twisted es una biblioteca de Python, que mantiene un script python ejecutándose para siempre para cualquier tarea de comunicación. (por ejemplo, Sockets) –

+2

Twisted es una biblioteca de Python para escribir servidores. Una vez que escriba un servidor en twisted, puede usar 'twistd -y server.py' para ejecutarlo como daemon – Nathan

0

Si usted está hablando de Linux, es tan fácil como hacer algo como ./myscript.py &

+1

nohup ./myscript.py y funcionará aunque –

+0

Lo que dijo Andre. Me olvidé de mencionar nohup porque normalmente solo ejecuto la pantalla y me desconecto, por lo que no hay necesidad de que haga eso. Estos downvoters son viciosos. – Unknown

+0

Pero incluso si está ejecutando la pantalla, no ha creado un daemon verdadero, todavía es un elemento secundario de su sesión de pantalla. nohup tampoco es la mejor solución, pero es una manera rápida de ejecutar un daemon una vez fuera. – JimB

2

en XP y posteriormente se puede utilizar el programa de sc.exe utilizar cualquier .exe como servicio :

>sc create 
Creates a service entry in the registry and Service Database. 
SYNTAX: 
sc create [service name] [binPath= ] <option1> <option2>... 
CREATE OPTIONS: 
NOTE: The option name includes the equal sign. 
type= <own|share|interact|kernel|filesys|rec> 
     (default = own) 
start= <boot|system|auto|demand|disabled> 
     (default = demand) 
error= <normal|severe|critical|ignore> 
     (default = normal) 
binPath= <BinaryPathName> 
group= <LoadOrderGroup> 
tag= <yes|no> 
depend= <Dependencies(separated by/(forward slash))> 
obj= <AccountName|ObjectName> 
     (default = LocalSystem) 
DisplayName= <display name> 
password= <password> 

Usted puede comenzar su PythonScript iniciando el intérprete de python con su guión como argumento:

python.exe myscript.py 
+0

Tengo una secuencia de comandos .py Python. ¿Dónde está el EXE? –

+0

Pruebe py2exe http://www.py2exe.org – Yancy

+0

simplemente puede iniciar el intérprete de Python con su secuencia de comandos como argumento: python.exe myscript.py –

Cuestiones relacionadas