web-dev-qa-db-fra.com

Comment exécuter un script Python en arrière-plan même après la déconnexion SSH?

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?

101
zihaoyu

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.

191
Edward Dale

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)

27
Cooper

Vous pouvez également utiliser écran GN , ce qui devrait être le cas pour tous les systèmes Linux/Unix.

Si vous êtes sur Ubuntu/Debian, sa variante améliorée byob est plutôt jolie aussi.

16

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.

10
Dustin Kirkland

Vous pouvez le faire, mais je préfère écran .

6
Randy Proctor

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.

5
Chouettou

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.

3
jonescb

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

1
Nikhil Sahu

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')