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

141

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.writeau lieu de printpour imprimer sur la sortie standard. Est-ce que je fais quelque chose de mal?


la source
Quelle variante nohuputilisez-vous? La version BSD écrit dans un fichier appelé nohup.outdans le répertoire courant (ou $HOME/nohup.outsi le répertoire courant n'est pas accessible en écriture). Je ne vois pas de moyen de changer le nom du fichier de sortie ...
wulong
@wulong C'est seulement si si stdout est un terminal.
John Kugelman
J'ai également essayé la commande sans redirection et cela n'a pas du tout créé le fichier nohup.out. Je ne sais pas de quelle variante il s'agit mais je suis sur SunOS 5.10 si cela aide.

Réponses:

103

Il semble que vous deviez vider régulièrement stdout (par exemple sys.stdout.flush()). Dans mes tests, Python ne le fait pas automatiquement, même printjusqu'à ce que le programme se termine.

Wulong
la source
17
python ainsi que d'autres programmes basés sur C stdio utilisent la mise en tampon de ligne dans le cas interactif (stdout est connecté à un tty) et la mise en mémoire tampon de bloc lorsqu'il est redirigé vers un fichier. Si python -ucela ne fonctionne pas; nohupaurait pu introduire son propre tampon.
jfs
12
@JFSebastian À partir d'aujourd'hui, nohupne met pas en mémoire tampon la sortie et python -ufonctionne très bien. (juste une mise à jour pour les gens)
Pijusn
1
@Pius: nohupest un utilitaire POSIX il pourrait y avoir différentes implémentations sur différentes plates-formes. btw, les E / S python3 ne sont plus basées sur C stdio mais ont un comportement de mise en mémoire tampon similaire.
jfs
382

Vous pouvez exécuter Python avec l' -uindicateur pour éviter la mise en mémoire tampon de la sortie:

nohup python -u ./cmd.py > cmd.log &
vz0
la source
12
C'est mieux! Merci beaucoup :)
Sadjad
@kommradHomer Je suppose que cela dépend de la quantité de sortie sur stdout / stderr que votre programme produit.
vz0
1
Fonctionne comme un charme. Je pense aussi que c'est une meilleure réponse que celle choisie comme correcte. Pourriez-vous s'il vous plaît marquer cela comme correct pour ne pas confondre les autres?
Ondrej Burkert
1
Attention: ça ne marche pas toujours . Je ne sais pas pourquoi. Le faites vous?
Basj
3
cela devrait être la réponse acceptée ... a fait ce que je voulais. Merci!
krinker
42
  • Utiliser -u avec a nohupfonctionné pour moi. L' utilisation -uforcera les stdout, stderrcours d' eau à être unbuffered. Cela n'affectera pas stdin. Tout sera enregistré dans le fichier " nohup.out ". Comme ça-

    nohup python -u your_code.py &

    Vous pouvez également l'enregistrer dans votre répertoire. Par ici-

    nohup python -u your_code.py > your_directory/nohup.out &
  • En outre, vous pouvez utiliser PYTHONUNBUFFERED. Si vous le définissez sur une chaîne non vide, cela fonctionnera de la même manière que l' -uoption. Pour utiliser ces commandes, exécutez ci-dessous avant d'exécuter du code python.

    export PYTHONUNBUFFERED=1

    ou

    export PYTHONUNBUFFERED=TRUE

PS- Je vais suggérer d'utiliser des outils comme cron-job pour exécuter les choses en arrière-plan et l'exécution planifiée.

Nurul Akter Towhid
la source
Quelle est la différence avec la réponse de @ vz0?
Deqing
1
@Deqing il n'y a pas de différence.
Overcode
2

Python 3.3 et supérieur a un argument flush à 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)
Ganesh Krishnan
la source
0

J'ai eu un problème similaire, mais pas lié à un processus Python. J'exécutais un script qui faisait un nohup et le script s'exécutait périodiquement via cron.

J'ai pu résoudre le problème en:

  1. rediriger les stdin, stdout et stderr
  2. s'assurer que le script appelé via nohup n'a rien exécuté d'autre en arrière-plan

PS: mes scripts ont été écrits en ksh tournant sous RHEL

Pradeep Anchan
la source