Script de shell de Unix para truncar un archivo grande

87

Estoy tratando de escribir un script Unix que truncará / vaciará un archivo que una aplicación escribe / abre continuamente cuando alcanza, por ejemplo, 3 GB de espacio. Sé que el siguiente comando lo haría:

cp /dev/null [filename]

Pero voy a ejecutar esto en un entorno de producción automáticamente como un trabajo cron, solo publique aquí para ver si tuvieron algún problema al hacer algo similar a esto.

peedee
fuente
Estos son prod. los registros no tienen valor? Tuve la suerte de mantener mis registros de producción durante más de un año (en bzip2 -9 fmt) y tenía algunas pequeñas utilidades que facilitaban la extracción de tiempos de ejecución de trabajos, los registros procesados ​​y, cuando se cargaban en una hoja de cálculo, era fácil calcular y graficar las relaciones de carga. y un montón de cosas. Descubrimos un problema de hdwr debido a la caída de las relaciones de carga. Sí, existen hermosas herramientas de monitoreo, por lo que todo depende de su situación. COMO OPCIÓN INDEPENDIENTE, ha mirado logrotate, podría proporcionarle algún valor (¡pero sería molesto configurarlo (solo adivinar)!).
shellter
5
Tenga en cuenta que si el archivo de registro se abre con el indicador O_APPEND, el truncamiento es efectivo. Si no se abre con el indicador O_APPEND, el programa continuará escribiendo con un desplazamiento de 3 GiB (la primera vez); el sistema tratará los primeros 3 GiB como todos-bytes-cero (que se comprime bien), pero el archivo seguirá creciendo. Todo depende del programa que escriba el registro.
Jonathan Leffler

Respuestas:

116

Solo para agregar otra respuesta,

: > filename

: es una operación no operativa en bash (compatible con POSIX), por lo que esencialmente solo abre el archivo para escribir (lo que, por supuesto, lo trunca) y luego lo cierra inmediatamente.

EDITAR: como comentó Shellter, en realidad no necesita un comando para acompañar la redirección:

$ echo foo > foo.txt
$ cat foo.txt
foo
$ > foo.txt
$ cat foo.txt
$

Una simple redirección por sí sola borrará el archivo.

chepner
fuente
25
o simplemente > filename(como estoy seguro que sabes). Buena suerte a todos.
shellter
5
@shelter "$> file" no POSIX y no portátil. Debe usar el comando ":" no-op antes de redireccionar, como se sugirió inicialmente.
Aaron Toponce
2
+ plus para cara sonriente
Chris Suszyński
2
Como señaló @AaronToponce, "$> file" de hecho no es portátil; en mi configuración de Zsh hace que el shell se cuelgue (supuestamente esperando una entrada). "$:> archivo" funciona bien en Zsh.
Linus Arver
1
@TechEnthusiast Depende de sus expectativas. El truncamiento en sí es atómico, pero no sabe realmente cuándo sucederá en relación con una escritura en particular. Por ejemplo, podría terminar con una línea parcial al principio del archivo.
chepner
65

He usado el siguiente comando en debian

truncate -s 0 filename
Ricardo Marimón
fuente
@SteveClay: sudo sh -c ': > filename'también se truncaráfilename
Perleone
2
La sugerencia @SteveClay PO también funciona a la perfección con sudo: sudo cp /dev/null filename. También cpes portátil mientras que truncatees solo Linux moderno.
Tino
11

Eso me parece razonable. Unix, por supuesto, le permitiría hacer esto de 50 formas diferentes. Por ejemplo,

echo -n "" >filename
cat /dev/null >filename
Don Branson
fuente
2

trunc filename

funciona en la versión AIX de UNIX

San
fuente