On Thu, 19 May 2011 15:30:04 +0200, Valerio Pachera <siri...@gmail.com> wrote: > Il 19 maggio 2011 15:22, Valerio Pachera <siri...@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 _______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python