Comment faire un script Python exécuter en tant que service?
Je veux exécuter un script python dans un serveur CENTOS:
#!/usr/bin/env python
import socket
try:
import thread
except ImportError:
import _thread as thread #Py3K changed it.
class Polserv(object):
def __init__(self):
self.numthreads = 0
self.tidcount = 0
self.port = 843
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sock.bind(('100.100.100.100', self.port))
self.sock.listen(5)
def run(self):
while True:
thread.start_new_thread(self.handle, self.sock.accept())
def handle(self,conn,addr):
self.numthreads += 1
self.tidcount += 1
tid=self.tidcount
while True:
data=conn.recv(2048)
if not data:
conn.close()
self.numthreads-=1
break
#if "<policy-file-request/>#!/usr/bin/env python
import socket
try:
import thread
except ImportError:
import _thread as thread #Py3K changed it.
class Polserv(object):
def __init__(self):
self.numthreads = 0
self.tidcount = 0
self.port = 843
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sock.bind(('100.100.100.100', self.port))
self.sock.listen(5)
def run(self):
while True:
thread.start_new_thread(self.handle, self.sock.accept())
def handle(self,conn,addr):
self.numthreads += 1
self.tidcount += 1
tid=self.tidcount
while True:
data=conn.recv(2048)
if not data:
conn.close()
self.numthreads-=1
break
#if "<policy-file-request/>\0" in data:
conn.sendall(b"<?xml version='1.0'?><cross-domain-policy><allow-access-from domain='*' to-ports='*'/></cross-domain-policy>")
conn.close()
self.numthreads-=1
break
#conn.sendall(b"[#%d (%d running)] %s" % (tid,self.numthreads,data) )
Polserv().run()
" in data:
conn.sendall(b"<?xml version='1.0'?><cross-domain-policy><allow-access-from domain='*' to-ports='*'/></cross-domain-policy>")
conn.close()
self.numthreads-=1
break
#conn.sendall(b"[#%d (%d running)] %s" % (tid,self.numthreads,data) )
Polserv().run()
Im en utilisant $ python flashpolicyd.py
et il fonctionne très bien...
La question est: Comment faire pour garder ce script en cours d'exécution même, après je ferme la console ssh?
- double possible de Comment faire un script python courir comme un service ou un démon sous linux
- Pas une copie exacte -- le liés à la question au sujet d'une tâche récurrente, c'est au sujet d'un réseau démon; la solution à l'autre a été cron, la solution est inetd (ou l'équivalent).
Vous devez vous connecter pour publier un commentaire.
- Je utiliser cette code de daemonize mes applications. Il vous permet
start/stop/restart
le script avec les commandes suivantes.En plus de cela j'ai aussi un init.d script pour le contrôle de mon service. Cela vous permet de démarrer automatiquement le service lors de votre démarrage du système d'exploitation-up.
Voici un exemple simple pour obtenir votre aller. Il suffit de déplacer votre code à l'intérieur d'une classe, et de l'appeler à partir de la
run
fonction à l'intérieur deMyDeamon
.Arriviste
Si vous exécutez un système d'exploitation à l'aide de Upstart (par exemple, CentOS 6) - vous pouvez également utiliser Upstart pour gérer le service. Si vous utilisez Arriviste, vous pouvez garder votre script, et il suffit d'ajouter quelque chose comme cela, sous
/etc/init/my-service.conf
Vous pouvez ensuite utiliser start/stop/restart pour gérer votre service.
par exemple
Un exemple plus détaillé de travailler avec upstart est disponible ici.
Systemd
Si vous exécutez un système d'exploitation qui utilise Systemd (par exemple, CentOS 7), vous pouvez prendre un coup d'oeil à la suite de Stackoverflow répondre.
Je vous offre deux recommandations:
supervisord
1) Installer le
supervisor
paquet (plus de commentaires ici les instructions de):2) Créer un fichier de configuration de votre démon à
/etc/supervisor/conf.d/flashpolicyd.conf
:3) Redémarrez
supervisor
pour charger votre nouveau.conf
systemd (si actuellement utilisé par votre distribution Linux)
Placez ce fichier dans
/etc/systemd/system/my_daemon.service
et de l'activer à l'aide desystemctl daemon-reload && systemctl enable my_daemon && systemctl start my_daemon --no-block
.Pour afficher les journaux:
systemctl status my_daemon
systemd
démon config de ma réponse. De nombreux Linuxes maintenant navire avecsystemd
pour les scripts d'initialisation et la configuration est très similaire à supervisord.Mon non pythonic approche serait d'utiliser & suffixe. Qui est:
Pour arrêter le script
également la tuyauterie & suffixe avec le renier serait de mettre le processus en vertu de superparent (en haut):
-bash: syntax error near unexpected token '|'
premier import os module dans votre application qu'avec l'utilisation de fonction getpid obtenir le pid de l'application et de l'enregistrer dans un fichier.par exemple :
et de créer un fichier bash /etc/init.d le chemin d'accès:
/etc/init.d/servername
maintenant , u pouvez démarrer et arrêter ur application avec la commande:
service servername arrêter
service servername commencer
ou
/etc/init.d/servername arrêter
/etc/init.d/servername commencer
pour mon script en python, j'utilise...
Pour DÉMARRER le script python :
Pour ARRÊTER le script python :
P. S.: désolé pour les mauvais en anglais, je suis du CHILI 😀