¿Es una forma fácil de limitar el tamaño del archivo (stdout) en un nivel de script de shell?

10

Ok, este es un caso de uso muy práctico desde mi punto de vista.

Digamos que tengo un simple shell oneliner que registra la salida en un archivo. Esto puede ser simplemente cualquier cosa, por ejemplo tcpdump. ¿Hay alguna forma genérica y trivial, para asegurarse, de que el archivo de salida no exceda el tamaño dado?

Resonando detrás de esto, es proteger de llenar todo el espacio disponible en el punto de montaje por error. Si me olvido del script, o producirá GB de datos por hora, entonces esta simple tarea de depuración puede conducir a un posible bloqueo del sistema.

Ahora, conozco las opciones compiladas en algunas de las herramientas (como la combinación de -W / -C en tcpdump). Lo que necesito es un sistema de seguridad muy genérico.

Larga historia corta: cuando ejecuto un script como:

% this -is --my=very|awsome|script >> /var/tmp/output.log

Cómo asegurarse de que output.log nunca sea más grande que 1GB.

El script puede bloquearse, ser asesinado o lo que sea.

La solución que busco debe ser fácil y simple, utilizando solo herramientas disponibles en distribuciones populares como ubuntu / debian / fedora. En general algo ampliamente disponible. El complicado programa multilínea no es una opción aquí, independientemente del idioma / tecnología.

mdrozdziel
fuente

Respuestas:

16

Puedes usar headpara esto:

command | head -c 1G > /var/tmp/output.log

Acepta K, M, G y similares como sufijos (los bytes son los predeterminados). Agregue 'B' para usar las versiones base 10.

Eduardo Ivanec
fuente
cabeza contra la pared No podría ser más simple. ¡Gracias!
mdrozdziel
2
Parece que tail -c 1Gtambién funciona, útil para mirar la cola de un evento. Es comprensible que se sonroje después del final del comando.
guiones
La unidad para sufijos no funciona en Mac OS.
anumi
0

Establezca el tamaño máximo de archivo para un usuario que solo se utilizará para ejecutar estos scripts.

El archivo /etc/security/limitslimita a un usuario con los valores de "predeterminado" a menos que haya valores explícitos para un usuario específico. Estos valores específicos del usuario sobrescribirán los valores predeterminados. El archivo puede tener un nombre ligeramente diferente dependiendo de su sistema operativo.

Si su usuario de registro se llama log_maker, agregue esta línea al archivo:

log_maker hard fsize 1000000

El número después de fsize es el tamaño máximo de archivo en KB.

Chris Ting
fuente
0

la limitación limita el tamaño de la salida de un programa y conserva los últimos X KB de salida con el siguiente comando:

run_program | curtail -s 1G myprogram.log

https://github.com/Comcast/Infinite-File-Curtailer

NOTA: Soy el mantenedor del repositorio anterior. Simplemente compartiendo la solución ...

Dave Wolaver
fuente
0

Puede limitar cualquier archivo con

tail -c 1G myLog.log > myLog.tmp
mv myLog.tmp > myLog.log

Escribir la cola directamente en el mismo archivo crea un archivo vacío. Por lo tanto, debe usar un archivo temporal.

Séverin
fuente
tail -c 1G myLog.log> myLog.tmp mv myLog.tmp> myLog.log esto matará el registro, creo que quería usar >> en lugar de> o no?
djdomi
El propósito de este comando es reescribir el registro con solo el último 1G. El >> debería ser para el comando anterior: doSomething >> myLog.log; cola -c 1G myLog.log> myLog.tmp; mv myLog.tmp> myLog.log;
Séverin