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?
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)
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.
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
@daemondef 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.
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
import yapdi
daemon = yapdi.Daemon()
retcode = daemon.daemonize()# This would run in daemon mode; output is not visibleif retcode == yapdi.OPERATION_SUCCESSFUL:print('Hello Daemon')
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?somecommand &
il affichera le pid comme[1] 12345
. sinon vous pouvez utiliser$!
.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-plandisown %1
(en supposant qu'il s'agit du travail n ° 1, utilisezjobs
pour déterminer)la source
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.
la source
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.
la source
Vous ne pouvez pas le faire, mais je préfère l' écran .
la source
Voici une solution simple à l'intérieur de python en utilisant un décorateur:
Vous pouvez bien sûr remplacer le contenu de votre
bgservice.py
fichier à la place demy_func
.la source
Le shell zsh a une option pour exécuter tous les processus d'arrière-plan avec nohup.
En
~/.zshrc
ajoutant les lignes: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.
la source
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
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 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
la source
Vous pouvez également utiliser Yapdi :
Utilisation de base:
la source
Essaye ça:
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 .
la source