2009-09-14 11 views
14

Est-il possible d'exécuter un script Python en tant que service d'arrière-plan sur un serveur Web? Je veux le faire pour socket communication.Puis-je exécuter un script Python en tant que service?

+0

Il est possible, pour une réponse plus détaillée, de fournir plus d'informations: quel système d'exploitation utilisez-vous, voulez-vous démarrer le service au redémarrage, etc. –

+0

Windows ou Unix Enviroment? – dmeister

+0

Pensez "Serveurs Unix/Linux", que les hébergeurs ont généralement. –

Répondre

8

Vous pouvez en faire un démon. Il y a un PEP pour une solution plus complète, mais j'ai trouvé que cela fonctionne 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

Dans l'extrait de code ci-dessus, je peux voir au moins un problème: la présence du démon renifleur n'est pas faite avant d'essayer de lancer une nouvelle instance. – jldupont

+1

reniflant? Voulez-vous dire si le démon est déjà en cours d'exécution? si c'est le cas, cela est fait dans une procédure différente avant d'appeler le ci-dessus. – Robert

+0

belle démostration, très amusant! Il y a beaucoup de méthode pour faire ce python-démon, sous-processus avec des appels shell personnalisés (nohup, &), mais c'est très simple à comprendre. Agréable :) –

7

Vous pourriez vouloir vérifier Twisted.

+0

Je l'ai vérifié, et c'est assez confus à saisir. So Twisted est une bibliothèque Python, qui garde un script python en marche pour n'importe quelle tâche de communication? (par exemple Sockets) –

+2

Twisted est une bibliothèque python pour l'écriture de serveurs. Une fois que vous avez écrit un serveur dans twisted, vous pouvez utiliser 'twistd -y server.py' pour l'exécuter en tant que démon – Nathan

0

Si vous parlez de linux, il est aussi facile que de faire quelque chose comme ./myscript.py &

+1

nohup ./myscript.py et fonctionnera bien –

+0

Ce qu'André a dit. J'ai oublié de mentionner nohup parce que je ne fais que lancer l'écran et le détacher, donc je n'ai pas besoin de faire ça. Ces downvoters sont vicieux. – Unknown

+0

Mais même si vous exécutez l'écran, vous n'avez pas créé de véritable démon, c'est toujours un enfant de votre session d'écran. nohup n'est pas non plus la meilleure solution, mais c'est un moyen rapide d'exécuter un démon unique. – JimB

2

sur XP et plus tard, vous pouvez utiliser le programme sc.exe d'utiliser un .exe comme un service :

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

Vous pouvez commencer votre PythonScript en lançant l'interpréteur python avec votre script comme argument:

python.exe myscript.py 
+0

J'ai un script .py Python. Où est le fichier EXE? –

+0

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

+0

vous pouvez simplement lancer l'interpréteur python avec votre script comme argument: myscript python.exe.py –

Questions connexes