Réponses:
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 supervise
pour qu'il puisse être redémarré si (quand) il meurt.
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-plan
disown %1
(en supposant qu'il s'agit du travail n ° 1, utilisez jobs
pour 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.
Vous ne pouvez pas le faire, mais je préfère l' é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 pour exécuter tous les processus d'arrière-plan avec nohup.
En ~/.zshrc
ajoutant 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.
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
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')
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 .
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?