J'étais curieux de savoir comment exécuter un script python en arrière-plan, en répétant une tâche toutes les 60 secondes. Je sais que vous pouvez mettre quelque chose en arrière-plan en utilisant &, est-ce efficace dans ce cas?
Je pensais à faire une boucle, à l'attendre 60s et à la charger à nouveau, mais quelque chose se sent mal à ce sujet.
Je pense que votre idée est à peu près exactement ce que vous voulez. Par exemple:
import time
def do_something():
with open("/tmp/current_time.txt", "w") as f:
f.write("The time is now " + time.ctime())
def run():
while True:
time.sleep(60)
do_something()
if __name__ == "__main__":
run()
L'appel à time.sleep(60)
mettra votre programme en veille pendant 60 secondes. Lorsque ce temps est écoulé, le système d'exploitation réveillera votre programme et exécutera la fonction do_something()
, puis le remettra en veille. Pendant que votre programme dort, il ne fait rien de très efficace. Il s'agit d'un modèle général pour l'écriture de services d'arrière-plan.
Pour l'exécuter réellement à partir de la ligne de commande, vous pouvez utiliser &:
$ python background_test.py &
En faisant cela, toute sortie du script ira au même terminal que celui à partir duquel vous l'avez démarré. Vous pouvez rediriger la sortie pour éviter cela:
$ python background_test.py >stdout.txt 2>stderr.txt &
Plutôt que d'écrire votre propre démon, utilisez plutôt python-daemon ! python-daemon implémente la spécification de démon bien tenue de PEP 314 , "Bibliothèque de processus de démon standard".
J'ai inclus un exemple de code basé sur la réponse acceptée à cette question, et même si le code semble presque identique, il a une différence fondamentale importante. Sans python-daemon vous devrez utiliser &
pour mettre votre processus en arrière-plan et Nohup
et pour éviter que votre processus ne soit tué lorsque vous quittez votre Shell. Au lieu de cela, cela se détachera automatiquement de votre terminal lorsque vous exécuterez le programme.
Par exemple:
import daemon
import time
def do_something():
while True:
with open("/tmp/current_time.txt", "w") as f:
f.write("The time is now " + time.ctime())
time.sleep(5)
def run():
with daemon.DaemonContext():
do_something()
if __name__ == "__main__":
run()
Pour l'exécuter réellement:
python background_test.py
Et notez l'absence de &
ici.
En outre, cette autre réponse de stackoverflow explique en détail les nombreux avantages de l'utilisation python-daemon .
L'utilisation de & dans le shell est probablement la manière la plus simple, comme l'a décrit Greg.
Si vous voulez vraiment créer un puissant démon, vous devrez regarder la commande os.fork ().
L'exemple de Wikipedia :
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os, time
def createDaemon():
"""
This function create a service/Daemon that will execute a det. task
"""
try:
# Store the Fork PID
pid = os.fork()
if pid > 0:
print 'PID: %d' % pid
os._exit(0)
except OSError, error:
print 'Unable to fork. Error: %d (%s)' % (error.errno, error.strerror)
os._exit(1)
doTask()
def doTask():
"""
This function create a task that will be a daemon
"""
# Open the file in write mode
file = open('/tmp/tarefa.log', 'w')
# Start the write
while True:
print >> file, time.ctime()
file.flush()
time.sleep(2)
# Close the file
file.close()
if __name__ == '__main__':
# Create the Daemon
createDaemon()
Et ensuite, vous pouvez placer la tâche dont vous avez besoin dans le bloc doTask()
.
Vous n'auriez pas besoin de lancer ceci en utilisant &, et cela vous permettrait de personnaliser un peu plus l'exécution.