[Python] Python e redirezione output

Daniele Varrazzo piro a develer.com
Gio 19 Maggio 2011 17:23:06 CEST


On Thu, 19 May 2011 15:30:04 +0200, Valerio Pachera <sirio81 a gmail.com>
wrote:
> Il 19 maggio 2011 15:22, Valerio Pachera <sirio81 a gmail.com> ha scritto:
>> Aggiungo un'altra osservazione: se uccido il processo (con kill e non
>> kill -9), tutto quello che era nel buffer non viene scritto.
> 
> Ne aggiungo altre due, poi vado a leggere il link di Manlio :-)
> 
> ./tmp.py &> tmp.log &
> mv tmp.log tmp.log2
> tail -f tmp.log2
> 
> Ho rinominato il file di log mentre ci scriveva dentro (ongi 5 sec col
> flush).
> Mi aspettavo che il file venisse ricreato o che la redirezione si
> interrompesse, invece l'output CONTINUA ad essere scriptto in tmp.log2
> !
> 
> Al contrario
> 
> ./tmp.py &> tmp.log &
> gzip tmp.log
> ls tmp.log*
>   tmp.log.gz
> 
> Se comprimo il file come farebbe il programma logrotate, il file di
> log non viene ricreato né va ascrivere su tmp.log.gz.
> La redirezione, a mio avviso, si interrompe ma lo script continua a
girare.

Puoi cancellare o rinominare il file dal file system, ma questo non cambia
il file descriptor che python tiene aperto. Se ad esempio cancelli il file
che python tiene aperto, praticamente metti il suo refcount a 0, e il file
viene tenuto in vita solo dal processo. All'uscita del processo, questo
sarà perso. Come curiosità, questo rende possibile salvare un file
cancellato per sbaglio se il processo lo tiene aperto: il primo file aperto
dal processo "pid" si può trovare in /proc/pid/fd/3 per esempio (0,1,2 sono
stdin/out/err) e il contenuto può ancora essere copiato da lì.

Se vuoi mettere da parte un risultato parziale del file, devi chiuderlo e
riaprirlo in append ogni volta.

Penso che in questo libro
<http://www.amazon.com/Advanced-Programming-UNIX-Environment-2nd/dp/0201433079>
ci sia "tutto quello che non volevate sapere sui file descriptor ma ve
l'hanno voluto dire per forza"... ma non ce l'ho sottomano per controllare.


-- 
Daniele Varrazzo - Develer S.r.l. 
http://www.develer.com


Maggiori informazioni sulla lista Python