190 votes

Nohup n'écrit pas le journal dans le fichier de sortie

J'utilise la commande suivante pour exécuter un script python en arrière-plan :

nohup ./cmd.py > cmd.log &

Mais il semble que nohup n'écrit rien dans le fichier journal. cmd.log est créé mais est toujours vide. Dans le script python, j'utilise sys.stdout.write au lieu de print pour imprimer sur la sortie standard. Est-ce que je fais quelque chose de mal ?

532voto

vz0 Points 11605

Vous pouvez exécuter Python avec la commande -u pour éviter la mise en mémoire tampon de la sortie :

nohup python -u ./cmd.py > cmd.log &

119voto

wulong Points 1360

Il semble que vous deviez vider la sortie d'état périodiquement (par exemple, en utilisant la commande sys.stdout.flush() ). Dans mes tests, Python ne le fait pas automatiquement, même avec l'option print jusqu'à ce que le programme se termine.

81voto

Nurul Akter Towhid Points 1528
  • Utilisation de -u avec nohup a fonctionné pour moi. Utilisation de -u obligera le stdout , stderr pour qu'ils ne soient pas bufferisés. Cela n'affectera pas stdin. Tout sera sauvegardé dans " nohup.out Fichier ". Comme ceci.

    nohup python -u your_code.py &

    Vous pouvez également le sauvegarder dans votre répertoire. De cette façon.

    nohup python -u your_code.py > your_directory/nohup.out &
  • Vous pouvez également utiliser PYTHONUNBUFFERED . Si vous le définissez comme une chaîne de caractères non vide, il fonctionnera de la même manière que l'option -u option. Pour l'utiliser, exécutez les commandes suivantes avant de lancer le code python.

    export PYTHONUNBUFFERED=1

    ou

    export PYTHONUNBUFFERED=TRUE

P.S.- Je vous suggère d'utiliser des outils tels que cron-job pour exécuter des tâches en arrière-plan et des exécutions planifiées.

22voto

Ryu_hayabusa Points 352
export PYTHONUNBUFFERED=1
nohup ./cmd.py > cmd.log &

ou

nohup python -u ./cmd.py > cmd.log &

https://docs.python.org/2/using/cmdline.html#cmdoption-u

6voto

Ganesh Krishnan Points 734

Python 3.3 et plus a un argument flush pour imprimer et c'est la seule méthode qui a fonctionné pour moi.

print("number to train = " + str(num_train), flush=True)
print("Using {} evaluation batches".format(num_evals), flush=True)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X