J'ai Python script bgservice.py
et je veux qu'il fonctionne tout le temps, car il fait partie du service Web que je crée. Comment puis-je le faire fonctionner en continu même après avoir déconnecté SSH?
Courir Nohup python bgservice.py &
pour que le script ignore le signal de blocage et continue à fonctionner. La sortie sera mise en Nohup.out
.
Idéalement, vous exécuteriez votre script avec quelque chose comme supervise
afin qu'il puisse être redémarré si (quand) il meurt.
Si vous avez déjà lancé le processus et que vous ne voulez pas le tuer et le redémarrer sous Nohup, vous pouvez l'envoyer en arrière-plan, puis le désavouer.
Ctrl+Z
_ (suspendre le processus)
bg
(redémarre le processus en arrière-plan
disown %1
(en supposant qu'il s'agisse du travail n ° 1, utilisez jobs
pour déterminer)
Vous pourriez envisager de transformer votre script python en un démon propre python, comme décrit ici .
python-daemon est un bon outil qui peut être utilisé pour exécuter python des scripts en tant que processus de démon en arrière-plan plutôt qu'un script à exécution permanente. Vous devrez modifier le code existant. un peu mais c'est clair et simple.
Si vous rencontrez des problèmes avec python-daemon, il existe un autre utilitaire supervisor qui fera la même chose pour vous, mais dans ce cas, vous ne devrez pas écrire de code (ni modifier le code existant) car il s'agit d'un solution prête à l'emploi pour la démonisation des processus.
Vous pouvez le faire, mais je préfère écran .
Voici une solution simple à l'intérieur de python en utilisant un décorateur:
import os, time
def daemon(func):
def wrapper(*args, **kwargs):
if os.fork(): return
func(*args, **kwargs)
os._exit(os.EX_OK)
return wrapper
@daemon
def my_func(count=10):
for i in range(0,count):
print('parent pid: %d' % os.getppid())
time.sleep(1)
my_func(count=10)
#still in parent thread
time.sleep(2)
#after 2 seconds the function my_func lives on is own
Vous pouvez bien sûr remplacer le contenu de votre bgservice.py
fichier à la place de my_func
.
Le shell zsh a une option permettant d’exécuter tous les processus en arrière-plan avec Nohup.
Dans ~/.zshrc
ajouter les lignes:
setopt nocheckjobs #don't warn about bg processes on exit
setopt Nohup #don't kill bg processes on exit
Ensuite, il vous suffit de lancer un processus comme celui-ci: python bgservice.py &
, et vous n'avez plus besoin d'utiliser la commande Nohup.
Je sais que peu de gens utilisent zsh, mais c'est un shell vraiment cool que je recommanderais.
Si vous avez besoin que le processus s'exécute à jamais, que vous soyez connecté ou non, envisagez de l'exécuter en tant que démon.
supervisord est une solution prête à l'emploi qui peut être utilisée pour démoniser n'importe quel processus. Il possède un autre utilitaire de contrôle, supervisorctl
, qui peut être utilisé pour surveiller les processus exécutés par le superviseur.
Vous n'avez pas besoin d'écrire de code supplémentaire ni de modifier les scripts existants pour que cela fonctionne. De plus, la documentation détaillée rend ce processus beaucoup plus simple.
Après avoir passé des heures à me gratter la tête autour de python-daemon, supervisor est la solution qui a fonctionné pour moi en quelques minutes.
J'espère que cela aidera quelqu'un qui essaie de faire fonctionner python-daemon
Vous pouvez également utiliser Yapdi:
Utilisation de base:
import yapdi daemon = yapdi.Daemon() retcode = daemon.daemonize() # This would run in daemon mode; output is not visible if retcode == yapdi.OPERATION_SUCCESSFUL: print('Hello Daemon')