Utilizo este código para demonizar mis aplicaciones. Te permite start/stop/restart
el script usando los siguientes comandos.
python myscript.py start
python myscript.py stop
python myscript.py restart
Además de esto, también tengo un script init.d para controlar mi servicio. Esto le permite iniciar automáticamente el servicio cuando se inicia su sistema operativo.
Aquí hay un ejemplo simple para que te pongas en marcha. Simplemente mueva su código dentro de una clase y llámelo desde el run
función dentro de 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)
Advenedizo
Si está ejecutando un sistema operativo que usa Upstart (por ejemplo, CentOS 6), también puede usar Upstart para administrar el servicio. Si usa Upstart, puede mantener su secuencia de comandos tal como está y simplemente agregar algo como esto en /etc/init/my-service.conf
start on started sshd
stop on runlevel [!2345]
exec /usr/bin/python /opt/my_service.py
respawn
Luego puede usar iniciar/detener/reiniciar para administrar su servicio.
por ejemplo
start my-service
stop my-service
restart my-service
Un ejemplo más detallado de cómo trabajar con upstart está disponible aquí.
Systemd
Si está ejecutando un sistema operativo que usa Systemd (por ejemplo, CentOS 7), puede consultar la siguiente respuesta de Stackoverflow.
Ofrezco dos recomendaciones:
supervisado
1) Instala el supervisor
paquete (instrucciones más detalladas aquí):
sudo apt-get install supervisor
2) Cree un archivo de configuración para su daemon en /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) Reiniciar supervisor
para cargar tu nuevo .conf
supervisorctl update
supervisorctl restart flashpolicyd
systemd (si actualmente lo usa su distribución de 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
Coloque este archivo en /etc/systemd/system/my_daemon.service
y habilitarlo usando systemctl daemon-reload && systemctl enable my_daemon && systemctl start my_daemon --no-block
.
Para ver registros:
systemctl status my_daemon