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?
nohup
utilisez-vous? La version BSD écrit dans un fichier appelénohup.out
dans le répertoire courant (ou$HOME/nohup.out
si le répertoire courant n'est pas accessible en écriture). Je ne vois pas de moyen de changer le nom du fichier de sortie ...Réponses:
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êmeprint
jusqu'à ce que le programme se termine.la source
python -u
cela ne fonctionne pas;nohup
aurait pu introduire son propre tampon.nohup
ne met pas en mémoire tampon la sortie etpython -u
fonctionne très bien. (juste une mise à jour pour les gens)nohup
est 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.Vous pouvez exécuter Python avec l'
-u
indicateur pour éviter la mise en mémoire tampon de la sortie:la source
Utiliser
-u
avec anohup
fonctionné pour moi. L' utilisation-u
forcera lesstdout
,stderr
cours d' eau à être unbuffered. Cela n'affectera pas stdin. Tout sera enregistré dans le fichier " nohup.out ". Comme ça-Vous pouvez également l'enregistrer dans votre répertoire. Par ici-
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'-u
option. Pour utiliser ces commandes, exécutez ci-dessous avant d'exécuter du code python.ou
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.
la source
ou
https://docs.python.org/2/using/cmdline.html#cmdoption-u
la source
Python 3.3 et supérieur a un argument flush à imprimer et c'est la seule méthode qui a fonctionné pour moi.
la source
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:
PS: mes scripts ont été écrits en ksh tournant sous RHEL
la source