¿Cómo puedo limitar el tamaño de un archivo de registro escrito >>
a 200 MB?
$ run_program >> myprogram.log
io-redirection
limit
size
david
fuente
fuente
Respuestas:
Si su aplicación (es decir,
run_program
) no admite limitar el tamaño del archivo de registro, puede verificar el tamaño del archivo periódicamente en un bucle con una aplicación o script externo.También puede usar
logrotate(8)
para rotar sus registros, tiene unsize
parámetro que puede usar para su propósito:fuente
postscript
opción para que la configuración logrotate se envíeSIGHUP
al programa.Si su programa no necesita escribir OTROS archivos que sean mayores que este límite, puede informar al núcleo de este límite utilizando
ulimit
. Antes de ejecutar su comando, ejecútelo para configurar un límite de tamaño de archivo de 200 MB para todos los procesos ejecutados en su sesión de shell actual:Esto protegerá su sistema, pero podría ser complicado para el programa que escribe el archivo. Como sugiere eyazici , considere configurar
logrotate
para podar los archivos de registro una vez que alcancen cierto tamaño o edad. Puede descartar datos antiguos o archivarlos durante un período de tiempo en una serie de archivos comprimidos.fuente
Puede crear una nueva imagen del sistema de archivos, montarla con un dispositivo de bucle y colocar el archivo de registro en ese sistema de archivos:
También puede usar en
tmpfs
lugar de un archivo, si tiene suficiente memoria.fuente
Puede truncar la salida con
head
:fuente
SIGPIPE
) una vez que haya alcanzado el límite de tamaño, en lugar de descartar los datos.dd
magia, pero sí @ Random832 es correcto, obtendrá unaSIGPIPE
comohead
/dd
/whatever
deja caer.trap '' SIGPIPE
?{ head -c "$size" >> log; cat > /dev/null; }
.En el paquete
apache2-utils
se llama utilidad actualrotatelogs
, puede ser útil para usted.Sinopsis:
rotatelogs [-l] [-L nombreenlace ] [-p programa ] [-f] [-t] [-v] [-e] [-c] [-n número de archivos ] tiempo de rotación del archivo de registro | tamaño de archivo (B | K | M | G) [ desplazamiento ]
Ejemplo:
Puede leer el manual completo en este enlace .
fuente
Estoy seguro de que el póster original ha encontrado una solución. Aquí hay otro para otros que pueden leer este hilo ...
La reducción limita el tamaño de la salida de un programa y conserva los últimos 200 MB de salida con el siguiente comando:
Referencias
NOTA: Soy el mantenedor del repositorio anterior. Simplemente compartiendo la solución ...
fuente
Como es texto, escribiría un guión en su idioma favorito y lo canalizaría a eso. Haga que maneje la E / S del archivo (o manténgalo todo en la memoria y luego vuélvalo a descargar
SIGHUP
o similar). Para eso, en lugar de 200 MB, pensaría en un número 'razonable' de líneas para realizar un seguimiento.fuente
syslog
ylogrotate
.El siguiente script debería hacer el trabajo.
Tiene un par de atajos obvios, pero en general hace lo que pediste. Dividirá el registro en trozos de un tamaño limitado, y la cantidad de trozos también es limitada. Todo se puede especificar a través de los argumentos de la línea de comandos. El archivo de registro también se especifica a través de la línea de comando.
Tenga en cuenta un pequeño problema si lo usa con el demonio que se bifurca en segundo plano. Usar una tubería evitará que el demonio pase al fondo. En este caso, hay una sintaxis (probablemente específica de bash) para evitar el problema:
Tenga en cuenta que
<&0
, aunque parece redundante, no funcionará sin esto.fuente