web-dev-qa-db-fra.com

Nohup n'écrit pas de 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’écrive 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 une sortie standard. Est-ce que je fais quelque chose de mal?

102
user1642513

Il semble que vous deviez vider la sortie standard régulièrement (par exemple, sys.stdout.flush()). Dans mes tests, Python ne le fait pas automatiquement même avec print jusqu'à la fin du programme.

84
wulong

Vous pouvez exécuter Python avec l'indicateur -u pour éviter la mise en tampon de sortie:

Nohup python -u ./cmd.py > cmd.log &
278
vz0

Utiliser ' -u ' avec ' Nohup ' a fonctionné pour moi. Tout sera sauvegardé dans le fichier "Nohup.out". Comme ça-

Nohup python -u code.py &
23
Nurul Akter Towhid
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

5
Ryu_hayabusa

J'ai eu un problème similaire, mais pas lié à un processus Python. Je courais un script qui a fait un Nohup et le script exécuté périodiquement via Cron.

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

  1. redirection des stdin, stdout et stderr
  2. s'assurer que le script appelé via Nohup n'exécute rien d'autre à l'arrière-plan

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

0
Pradeep Anchan

Python 3.3 et supérieur a un argument de couleur 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)
0
Ganesh Krishnan