2009-09-14 38 views
14

È possibile eseguire uno script Python come servizio in background su un server web? Voglio fare questo per socket communication.Posso eseguire uno script Python come servizio?

+0

È possibile, per una risposta più dettagliata, fornire ulteriori informazioni: quale sistema operativo si utilizza, si desidera avviare il servizio al riavvio, ecc. –

+0

Windows o ambiente Unix? – dmeister

+0

Pensate "server Unix/linux", che gli host web hanno in genere. –

risposta

8

Puoi renderlo un demone. C'è un PEP per una soluzione più completa, ma ho trovato che questo funziona bene.

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

Nello snippet di codice sopra, posso vedere almeno un problema: la presenza del daemon di sniffing non viene eseguita prima di tentare di avviare un'istanza nuova. – jldupont

+1

sniffing? Intendi controllare se il demone è già in esecuzione? se è così, questo è fatto in una procedura diversa prima di chiamare quanto sopra. – Robert

+0

bella dimostrazione, molto divertente! C'è un sacco di metodi per fare questo python-daemon, sottoprocesso con chiamate personalizzate (nohup, &), ma questo è molto semplice da capire. Bello :) –

7

si potrebbe voler controllare Twisted.

+0

L'ho controllato, ed è abbastanza difficile da capire. Quindi Twisted è una libreria Python, che mantiene uno script python in esecuzione per sempre per qualsiasi compito di comunicazione? (es .: socket) –

+2

Twisted è una libreria python per scrivere server. Dopo aver scritto un server in twisted, puoi usare 'twistd -y server.py' per eseguirlo come un demone – Nathan

0

Se si sta parlando di Linux, è facile come fare qualcosa di simile ./myscript.py &

+1

nohup ./myscript.py e funzionerà anche se –

+0

Cosa ha detto Andre. Ho omesso di menzionare nohup perché di solito eseguo solo lo screen e il distacco, quindi non ho bisogno di farlo. Questi downvoters sono cattivi. – Unknown

+0

Ma anche se stai usando la schermata, non hai creato un vero demone, è ancora un figlio della tua sessione video. nohup non è la soluzione migliore, ma è un modo rapido per eseguire un demone una tantum. – JimB

2

su XP e versioni successive è possibile utilizzare il Sc.exe programma di utilizzare qualsiasi exe come servizio :

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

Si può iniziare la PythonScript avviando l'interprete Python con lo script come argomento:

python.exe myscript.py 
+0

Ho uno script .py Python. Dov'è l'EXE? –

+0

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

+0

puoi solo avviare l'interprete python con il tuo script come argomento: python.exe myscript.py –

Problemi correlati