Escribí un script de Python que verifica una determinada dirección de correo electrónico y pasa nuevos correos electrónicos a un programa externo. ¿Cómo puedo hacer que este script se ejecute 24/7, como convertirlo en demonio o servicio en Linux? ¿También necesitaría un bucle que nunca termina en el programa, o puede hacerse simplemente haciendo que el código se vuelva a ejecutar varias veces?
175
systemd
, puede crear un servicio systemd endaemon
modo como se describe aquí . Ver también: freedesktop.org/software/systemd/man/systemd.service.htmlRespuestas:
Tienes dos opciones aquí.
Realice un trabajo cron adecuado que llame a su script. Cron es un nombre común para un demonio GNU / Linux que lanza scripts periódicamente de acuerdo con un cronograma establecido. Agregue su script a un crontab o coloque un enlace simbólico en un directorio especial y el demonio se encargará de iniciarlo en segundo plano. Puedes leer más en Wikipedia. Hay una variedad de demonios cron diferentes, pero su sistema GNU / Linux ya debería tenerlo instalado.
Use algún tipo de enfoque de Python (una biblioteca, por ejemplo) para que su script pueda demonizarse a sí mismo. Sí, requerirá un bucle de eventos simple (donde sus eventos son disparadores de temporizador, posiblemente, proporcionados por la función de suspensión).
No recomendaría que elijas 2. porque estarías, de hecho, repitiendo la funcionalidad cron. El paradigma del sistema Linux es permitir que múltiples herramientas simples interactúen y resuelvan sus problemas. A menos que haya razones adicionales por las que debería hacer un demonio (además de disparar periódicamente), elija el otro enfoque.
Además, si usa daemonize con un bucle y ocurre un bloqueo, nadie revisará el correo después de eso (como lo señaló Ivan Nevostruev en los comentarios a esta respuesta). Mientras que si el script se agrega como un trabajo cron, simplemente se activará nuevamente.
fuente
crontab
lista? Si configuro tal.py
por hora, ¿creará muchos procesos que nunca terminarán? Si es así, creo que a este le gustaría un demonio.Aquí hay una buena clase que se toma desde aquí :
fuente
Deberías usar la biblioteca python-daemon , se encarga de todo.
Desde PyPI: Biblioteca para implementar un proceso de demonio Unix con buen comportamiento.
fuente
Puede usar fork () para separar su script del tty y hacer que continúe ejecutándose, así:
Por supuesto, también debe implementar un bucle sin fin, como
Espero que esto te ayude a comenzar.
fuente
nohup
/ commanddisown
separaría el proceso de la consola y no morirá. O puede comenzar con init.dTambién puede hacer que el script de Python se ejecute como un servicio utilizando un script de shell. Primero cree una secuencia de comandos de shell para ejecutar la secuencia de comandos de Python de esta manera (nombre de archivo nombre arbitrario)
ahora cree un archivo en /etc/init.d/scriptname
Ahora puede iniciar y detener su secuencia de comandos de Python usando el comando /etc/init.d/scriptname start o stop.
fuente
Una versión simple y compatible es
Daemonize
.Instálelo desde Python Package Index (PyPI):
y luego usar como:
fuente
cron
Es claramente una gran opción para muchos propósitos. Sin embargo, no crea un servicio o demonio como lo solicitó en el OP.cron
solo ejecuta trabajos periódicamente (lo que significa que el trabajo comienza y se detiene), y no más de una vez / minuto. Hay problemas concron
, por ejemplo, si una instancia anterior de su secuencia de comandos todavía se está ejecutando la próxima vez que secron
produce el cronograma y se inicia una nueva instancia, ¿está bien?cron
no maneja dependencias; solo intenta comenzar un trabajo cuando el horario lo indica.Si encuentra una situación en la que realmente necesita un demonio (un proceso que nunca deja de ejecutarse), eche un vistazo
supervisord
. Proporciona una manera simple de envolver un script o programa normal no demonizado y hacerlo funcionar como un demonio. Esta es una forma mucho mejor que crear un demonio nativo de Python.fuente
¿
$nohup
Qué hay de usar el comando en Linux?Lo uso para ejecutar mis comandos en mi servidor Bluehost.
Por favor, consejo si estoy equivocado.
fuente
Si está utilizando la terminal (ssh o algo) y desea mantener un script de larga duración después de cerrar sesión en la terminal, puede intentar esto:
screen
apt-get install screen
crear una terminal virtual dentro (es decir, abc):
screen -dmS abc
ahora nos conectamos a abc:
screen -r abc
Entonces, ahora podemos ejecutar el script python:
python keep_sending_mails.py
a partir de ahora, puede cerrar directamente su terminal, sin embargo, el script de Python seguirá ejecutándose en lugar de cerrarse
Si desea volver a comprobar el estado de ejecución de su script, puede
screen -r abc
volver a usarfuente
Primero, lea sobre alias de correo. Un alias de correo hará esto dentro del sistema de correo sin que tenga que perder el tiempo con demonios o servicios ni nada por el estilo.
Puede escribir un script simple que se ejecutará mediante sendmail cada vez que se envíe un mensaje de correo a un buzón específico.
Ver http://www.feep.net/sendmail/tutorial/intro/aliases.html
Si realmente desea escribir un servidor innecesariamente complejo, puede hacerlo.
Eso es todo lo que se necesita. Tu guión simplemente gira y duerme.
fuente
do_the_work()
puede bloquear el script y que nadie vuelva a ejecutarlotry
parte falla y laexcept:
parte se llamará en su lugar (en este caso nada), pero el bucle continuará y seguirá intentando llamar a la función.Suponiendo que realmente desea que su bucle se ejecute 24/7 como un servicio en segundo plano
Para una solución que no implica inyectar su código con bibliotecas, simplemente puede crear una plantilla de servicio, ya que está utilizando Linux:
Coloque ese archivo en su carpeta de servicio de daemon (generalmente
/etc/systemd/system/
) e instálelo utilizando los siguientes comandos systemctl (probablemente requerirá privilegios de sudo):Luego puede verificar que su servicio se esté ejecutando mediante el comando:
fuente
Yo recomendaría esta solución. Necesita heredar y anular el método
run
.fuente
para crear algo que se ejecuta como servicio, puede usar esto:
Lo primero que debe hacer es instalar el cemento marco de : el marco de cemento es un marco de CLI que puede implementar su aplicación en él.
interfaz de línea de comando de la aplicación:
interface.py
Clase YourApp.py:
Tenga en cuenta que su aplicación debe ejecutarse en un hilo para ser demonio
Para ejecutar la aplicación solo haz esto en la línea de comando
fuente
Use cualquier administrador de servicios que ofrezca su sistema, por ejemplo, en Ubuntu use upstart . Esto manejará todos los detalles para usted, como comenzar en el arranque, reiniciar en caso de accidente, etc.
fuente