J'ai écrit un script Python qui vérifie une certaine adresse e-mail et transmet les nouveaux e-mails à un programme externe. Comment puis-je faire exécuter ce script 24h / 24 et 7j / 7, par exemple en le transformant en démon ou en service sous Linux. Aurais-je également besoin d'une boucle qui ne se termine jamais dans le programme, ou cela peut-il être fait en faisant simplement ré-exécuter le code plusieurs fois?
175
systemd
vous pouvez créer un service systemd endaemon
mode comme décrit ici . Voir aussi: freedesktop.org/software/systemd/man/systemd.service.htmlRéponses:
Vous avez deux options ici.
Faites un travail cron approprié qui appelle votre script. Cron est un nom commun pour un démon GNU / Linux qui lance périodiquement des scripts selon une planification que vous avez définie. Vous ajoutez votre script dans une crontab ou placez un lien symbolique vers celui-ci dans un répertoire spécial et le démon se charge de le lancer en arrière-plan. Vous pouvez en savoir plus sur Wikipedia. Il existe une variété de démons cron différents, mais votre système GNU / Linux devrait l'avoir déjà installé.
Utilisez une sorte d' approche python (une bibliothèque, par exemple) pour que votre script puisse se démoniser. Oui, cela nécessitera une simple boucle d'événements (où vos événements sont déclenchés par la minuterie, éventuellement, fournis par la fonction de veille).
Je ne vous recommanderais pas de choisir 2., car vous répéteriez en fait la fonctionnalité cron. Le paradigme du système Linux est de laisser plusieurs outils simples interagir et résoudre vos problèmes. Sauf s'il existe des raisons supplémentaires pour lesquelles vous devriez créer un démon (en plus de le déclencher périodiquement), choisissez l'autre approche.
De plus, si vous utilisez daemonize avec une boucle et qu'un crash se produit, personne ne vérifiera le courrier après cela (comme l'a souligné Ivan Nevostruev dans les commentaires de cette réponse). Alors que si le script est ajouté en tant que tâche cron, il se déclenchera à nouveau.
la source
crontab
liste? Si je le configure.py
toutes les heures, cela créera-t-il de nombreux processus qui ne seront jamais terminés? Si c'est le cas, je pense que cela ressemblerait à un démon.Voici une belle classe tirée d' ici :
la source
Vous devriez utiliser la bibliothèque python-daemon , elle s'occupe de tout.
De PyPI: Library pour implémenter un processus démon Unix bien comporté.
la source
Vous pouvez utiliser fork () pour détacher votre script du tty et le faire continuer à s'exécuter, comme ceci:
Bien sûr, vous devez également implémenter une boucle sans fin, comme
J'espère que vous avez commencé.
la source
nohup
/disown
détacheraient le processus de la console et il ne mourrait pas. Ou vous pouvez le démarrer avec init.dVous pouvez également exécuter le script python en tant que service à l'aide d'un script shell. Commencez par créer un script shell pour exécuter le script python comme celui-ci (nom du script nom arbitraire)
créez maintenant un fichier dans /etc/init.d/scriptname
Vous pouvez maintenant démarrer et arrêter votre script python en utilisant la commande /etc/init.d/scriptname start ou stop.
la source
Une version simple et prise en charge est
Daemonize
.Installez-le à partir de Python Package Index (PyPI):
puis utilisez comme:
la source
cron
est clairement un excellent choix à de nombreuses fins. Cependant, il ne crée pas de service ou de démon comme vous l'avez demandé dans l'OP.cron
exécute uniquement les travaux périodiquement (ce qui signifie que le travail démarre et s'arrête), et pas plus d'une fois / minute. Il y a des problèmes aveccron
- par exemple, si une instance précédente de votre script est toujours en cours d'exécution la prochaine fois que lecron
calendrier arrive et lance une nouvelle instance, est-ce OK?cron
ne gère pas les dépendances; il essaie simplement de démarrer un travail lorsque le calendrier le demande.Si vous trouvez une situation où vous avez vraiment besoin d'un démon (un processus qui ne s'arrête jamais), jetez un œil à
supervisord
. Il fournit un moyen simple d'encapsuler un script ou un programme normal et non démonisé et de le faire fonctionner comme un démon. C'est un bien meilleur moyen que de créer un démon Python natif.la source
que diriez-vous d'utiliser la
$nohup
commande sur linux?Je l'utilise pour exécuter mes commandes sur mon serveur Bluehost.
S'il vous plaît aviser si je me trompe.
la source
Si vous utilisez un terminal (ssh ou quelque chose du genre) et que vous souhaitez conserver un script de longue durée après vous être déconnecté du terminal, vous pouvez essayer ceci:
screen
apt-get install screen
créer un terminal virtuel à l'intérieur (à savoir abc):
screen -dmS abc
maintenant nous nous connectons à abc:
screen -r abc
Donc, maintenant, nous pouvons exécuter un script python:
python keep_sending_mails.py
à partir de maintenant, vous pouvez fermer directement votre terminal, cependant, le script python continuera à s'exécuter au lieu d'être arrêté
Si vous souhaitez revenir vérifier l'état d'exécution de votre script, vous pouvez utiliser à
screen -r abc
nouveaula source
Tout d'abord, lisez les alias de messagerie. Un alias de messagerie le fera dans le système de messagerie sans que vous ayez à vous amuser avec des démons ou des services ou quoi que ce soit de ce genre.
Vous pouvez écrire un script simple qui sera exécuté par sendmail chaque fois qu'un message électronique est envoyé à une boîte aux lettres spécifique.
Voir http://www.feep.net/sendmail/tutorial/intro/aliases.html
Si vous voulez vraiment écrire un serveur inutilement complexe, vous pouvez le faire.
C'est tout ce qu'il faut. Votre script boucle et s'endort simplement.
la source
do_the_work()
le script peut planter et que personne ne l'exécute à nouveautry
partie échoue et laexcept:
partie sera appelée à la place (dans ce cas rien) mais la boucle continuera et continuera d'essayer d'appeler la fonction.En supposant que vous souhaitiez vraiment que votre boucle fonctionne 24h / 24 et 7j / 7 en tant que service d'arrière-plan
Pour une solution qui n'implique pas d'injecter votre code avec des bibliothèques, vous pouvez simplement créer un modèle de service, puisque vous utilisez Linux:
Placez ce fichier dans votre dossier de service démon (généralement
/etc/systemd/system/
) et installez-le à l'aide des commandes systemctl suivantes (cela nécessitera probablement les privilèges sudo):Vous pouvez ensuite vérifier que votre service est en cours d'exécution à l'aide de la commande:
la source
Je recommanderais cette solution. Vous devez hériter et remplacer la méthode
run
.la source
pour créer quelque chose qui fonctionne comme un service, vous pouvez utiliser cette chose:
La première chose que vous devez faire est d'installer le framework Cement : le cadre de travail en ciment est un travail de cadre CLI sur lequel vous pouvez déployer votre application.
interface de ligne de commande de l'application:
interface.py
Classe YourApp.py:
Gardez à l'esprit que votre application doit s'exécuter sur un thread pour être un démon
Pour exécuter l'application, faites-le simplement en ligne de commande
la source
Utilisez n'importe quel gestionnaire de services proposé par votre système - par exemple sous Ubuntu, utilisez upstart . Cela gérera tous les détails pour vous tels que le démarrage au démarrage, le redémarrage en cas de panne, etc.
la source