Nohup non sta scrivendo il registro nel file di output


141

Sto usando il seguente comando per eseguire uno script Python in background:

nohup ./cmd.py > cmd.log &

Ma sembra che nohup non stia scrivendo nulla nel file di registro. cmd.log viene creato ma è sempre vuoto. Nello script python, sto usando sys.stdout.writeinvece di printstampare su output standard. Sto facendo qualcosa di sbagliato?


Quale variante nohupstai usando? La versione BSD scrive su un file chiamato nohup.outnella directory corrente (o $HOME/nohup.outse la directory corrente non è scrivibile). Non vedo un modo per cambiare il nome del file di output ...
wulong,

@wulong Questo è solo se stdout è un terminale.
John Kugelman,

Ho anche provato il comando senza reindirizzamento e non ha creato il file nohup.out. Non so quale variante sia, ma sono su SunOS 5.10 se questo aiuta.

Risposte:


103

Sembra che sia necessario lavare periodicamente lo stdout (ad es sys.stdout.flush().). Nel mio test, Python non lo fa automaticamente nemmeno printfino alla chiusura del programma.


17
python e altri programmi basati su C stdio usano il buffering di linea in caso interattivo (stdout è collegato a un tty) e il buffering a blocchi quando reindirizzati a un file. Se python -unon funziona; nohuppotrebbe aver introdotto il proprio buffering.
jfs,

12
@JFSebastian Ad oggi, nohupnon bufferizza l'output e python -ufunziona bene. (solo un aggiornamento per le persone)
Pijusn,

1
@Pius: nohupè un'utilità POSIX che potrebbe avere implementazioni diverse su piattaforme diverse. btw, I / O python3 non è più basato su C stdio ma ha un comportamento di buffering simile.
jfs,

381

È possibile eseguire Python con il -uflag per evitare il buffering dell'output:

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

12
Questo è meglio! Grazie mille :)
Sadjad,

@kommradHomer Immagino che dipenda dalla quantità di output su stdout / stderr prodotta dal tuo programma.
v0,

1
Funziona come un fascino. Penso anche che sia una risposta migliore di quella selezionata come corretta. Potresti contrassegnarlo come corretto per non confondere gli altri?
Ondrej Burkert,

1
Attenzione: non sempre funziona . Non so perché. Fai?
Basj,

3
questa dovrebbe essere la risposta accettata ... ha fatto quello che volevo. Grazie!
Krinker,

42
  • Usando -u con nohuplavorato per me. L'uso -ucostringerà i flussi stdout, stderra non essere bufferizzati. Non influenzerà lo stdin. Tutto verrà salvato nel file " nohup.out ". Come questo-

    nohup python -u your_code.py &

    Puoi anche salvarlo nella tua directory. Per di qua-

    nohup python -u your_code.py > your_directory/nohup.out &
  • Inoltre, puoi usare PYTHONUNBUFFERED. Se lo si imposta su una stringa non vuota funzionerà come l' -uopzione. Per usare questo comando sotto i comandi prima di eseguire il codice Python.

    export PYTHONUNBUFFERED=1

    o

    export PYTHONUNBUFFERED=TRUE

PS : suggerirò di usare strumenti come cron-job per eseguire le cose in background e l'esecuzione pianificata.


Qual è la differenza con la risposta di @ vz0?
Deqing,

1
@Deqing non c'è differenza.
Overcode


2

Python 3.3 e versioni successive hanno un argomento flush da stampare e questo è l'unico metodo che ha funzionato per me.

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

0

Ho avuto un problema simile, ma non collegato a un processo Python. Stavo eseguendo uno script che faceva un nohup e lo script veniva eseguito periodicamente tramite cron.

Sono stato in grado di risolvere il problema:

  1. reindirizzare lo stdin, lo stdout e lo stderr
  2. assicurando che lo script invocato tramite nohup non eseguisse nient'altro in background

PS: i miei script sono stati scritti in ksh in esecuzione su RHEL

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.