Uso questo codice per demonizzare le mie applicazioni. Ti consente start/stop/restart
lo script utilizzando i seguenti comandi.
python myscript.py start
python myscript.py stop
python myscript.py restart
Oltre a questo ho anche uno script init.d per controllare il mio servizio. Ciò consente di avviare automaticamente il servizio all'avvio del sistema operativo.
Ecco un semplice esempio per iniziare. Basta spostare il codice all'interno di una classe e chiamarlo dal run
funzione all'interno di MyDeamon
.
import sys
import time
from daemon import Daemon
class YourCode(object):
def run(self):
while True:
time.sleep(1)
class MyDaemon(Daemon):
def run(self):
# Or simply merge your code with MyDaemon.
your_code = YourCode()
your_code.run()
if __name__ == "__main__":
daemon = MyDaemon('/tmp/daemon-example.pid')
if len(sys.argv) == 2:
if 'start' == sys.argv[1]:
daemon.start()
elif 'stop' == sys.argv[1]:
daemon.stop()
elif 'restart' == sys.argv[1]:
daemon.restart()
else:
print "Unknown command"
sys.exit(2)
sys.exit(0)
else:
print "usage: %s start|stop|restart" % sys.argv[0]
sys.exit(2)
Iniziato
Se utilizzi un sistema operativo che utilizza Upstart (ad esempio CentOS 6), puoi anche utilizzare Upstart per gestire il servizio. Se usi Upstart puoi mantenere il tuo script così com'è e aggiungere semplicemente qualcosa di simile sotto /etc/init/my-service.conf
start on started sshd
stop on runlevel [!2345]
exec /usr/bin/python /opt/my_service.py
respawn
Puoi quindi utilizzare start/stop/restart per gestire il tuo servizio.
ad esempio
start my-service
stop my-service
restart my-service
Un esempio più dettagliato di come lavorare con upstart è disponibile qui.
Systemd
Se stai utilizzando un sistema operativo che utilizza Systemd (ad es. CentOS 7) puoi dare un'occhiata alla seguente risposta di StackOverflow.
Offro due consigli:
supervisore
1) Installa il supervisor
pacchetto (istruzioni più dettagliate qui):
sudo apt-get install supervisor
2) Crea un file di configurazione per il tuo demone in /etc/supervisor/conf.d/flashpolicyd.conf
:
[program:flashpolicyd]
directory=/path/to/project/root
environment=ENV_VARIABLE=example,OTHER_ENV_VARIABLE=example2
command=python flashpolicyd.py
autostart=true
autorestart=true
3) Riavvia supervisor
per caricare il tuo nuovo .conf
supervisorctl update
supervisorctl restart flashpolicyd
systemd (se attualmente utilizzato dalla tua distribuzione Linux)
[Unit]
Description=My Python daemon
[Service]
Type=simple
ExecStart=/usr/bin/python3 /opt/project/main.py
WorkingDirectory=/opt/project/
Environment=API_KEY=123456789
Environment=API_PASS=password
Restart=always
RestartSec=2
[Install]
WantedBy=sysinit.target
Inserisci questo file in /etc/systemd/system/my_daemon.service
e abilitalo usando systemctl daemon-reload && systemctl enable my_daemon && systemctl start my_daemon --no-block
.
Per visualizzare i log:
systemctl status my_daemon