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

110

J'ai un script Python bgservice.pyet je veux qu'il s'exécute 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?

zihaoyu
la source

Réponses:

213

Exécutez nohup python bgservice.py &pour que le script ignore le signal de raccrochage et continue de s'exécuter. La sortie sera insérée nohup.out.

Idéalement, vous exécuteriez votre script avec quelque chose comme supervisepour qu'il puisse être redémarré si (quand) il meurt.

Edward Dale
la source
15
quand nohup: ignoring in put and appending output to j'exécute la commande avec nohup et &, j'obtiens le message nohup.out '' et quand j'appuie sur Entrée, le processus se termine avec le statut 1. Que se passe-t-il?
Santosh Ghimire
1
lire la sortie dans nohup.out. dans mon cas, c'était un problème d'autorisations, j'avais besoin d'utiliser sudo
mxns
et comment arrêter le bgservice après son exécution dans cette méthode?
feu dans le trou le
1
@Shaegorath enregistre le pid quelque part afin que vous puissiez envoyer des signaux au processus plus tard. dans certains shells (bash, zsh, etc.) après cela, somecommand &il affichera le pid comme [1] 12345. sinon vous pouvez utiliser $!.
Tony Beta Lambda
31

Si vous avez déjà commencé 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émarrez le processus en arrière-plan

disown %1(en supposant qu'il s'agit du travail n ° 1, utilisez jobspour déterminer)

Tonnelier
la source
17

Vous pouvez également utiliser l' écran GNU que presque tous les systèmes Linux / Unix devraient avoir.

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

Dirk Eddelbuettel
la source
12

Vous pouvez envisager de transformer votre script python en un véritable démon python, comme décrit ici .

python-daemon est un bon outil qui peut être utilisé pour exécuter des scripts python en tant que processus de démon d'arrière-plan plutôt que comme script à exécution permanente. Vous devrez modifier un peu le code existant, mais c'est clair et simple.

Si vous rencontrez des problèmes avec python-daemon, il existe un autre superviseur d' utilitaires qui fera la même chose pour vous, mais dans ce cas, vous n'aurez pas à écrire de code (ou à modifier l'existant) car il s'agit d'une solution prête à l'emploi pour la démonisation processus.

Dustin Kirkland
la source
donner une brève explication sur la façon dont le problème peut être résolu est généralement une bonne idée.
Nikhil Sahu
7

Vous ne pouvez pas le faire, mais je préfère l' écran .

Randy Proctor
la source
5

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.pyfichier à la place de my_func.

Chouettou
la source
1
Il est peut-être nécessaire de capter le signal SIGHUP. Ajoutez ensuite signal.signal (signal.SIGHUP, handler) dans votre bloc.
Chouettou
3

Le shell zsh a une option pour exécuter tous les processus d'arrière-plan avec nohup.

En ~/.zshrcajoutant 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 d'exécuter 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.

jonescb
la source
1

Si vous avez besoin que le processus s'exécute indéfiniment, que vous soyez connecté ou non, envisagez d'exécuter le processus en tant que démon.

supervisord est une excellente solution prête à l'emploi qui peut être utilisée pour démoniser n'importe quel processus. Il dispose d'un autre utilitaire de contrôle supervisorctlqui peut être utilisé pour surveiller les processus exécutés par le superviseur.

Vous n'avez pas besoin d'écrire de code supplémentaire ou de modifier les scripts existants pour que cela fonctionne. De plus, une documentation détaillée rend ce processus beaucoup plus simple.

Après m'être gratté la tête pendant des heures autour de python-daemon, supervisor est la solution qui a fonctionné pour moi en quelques minutes.

J'espère que cela aide quelqu'un à essayer de faire fonctionner python-daemon

Nikhil Sahu
la source
1

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')
Victor Mendonça Nogueira
la source
1

Essaye ça:

nohup python -u <your file name>.py >> <your log file>.log &

Vous pouvez exécuter la commande ci-dessus dans l' écran et sortir de l'écran.

Vous pouvez maintenant suivre les journaux de votre script python en: tail -f <your log file>.log

Pour tuer votre script, vous pouvez utiliser les commandes ps -aux et kill .

Sushil Verma
la source