Un moyen facile de limiter la taille du fichier (stdout) au niveau du script shell?

10

Ok, c'est un cas d'utilisation très pratique de mon point de vue.

Disons que j'ai un simple shell oneliner qui enregistre la sortie dans un fichier. Cela peut être simplement n'importe quoi, par exemple tcpdump. Existe-t-il un moyen générique et trivial, pour vous assurer, que le fichier de sortie ne dépassera pas la taille donnée?

Résonner derrière cela, c'est pour éviter de remplir tout l'espace disponible sur le point de montage par erreur. Si j'oublie le script, ou s'il produira des Go de données par heure, cette simple tâche de débogage peut entraîner un crash système potentiel.

Maintenant, je connais les options construites dans certains des outils (comme la combinaison de -W / -C dans tcpdump). Ce dont j'ai besoin, c'est d'une sécurité intégrée très générique.

Longue histoire courte - quand je lance un script comme:

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

Comment vous assurer que output.log ne dépassera jamais 1 Go.

Le script peut planter, être tué ou autre.

La solution que je recherche devrait être facile et simple, en utilisant uniquement les outils disponibles dans les distributions populaires comme ubuntu / debian / fedora. En général, quelque chose de largement disponible. Le programme multiligne compliqué n'est pas une option ici indépendamment de la langue / technologie.

mdrozdziel
la source

Réponses:

16

Vous pouvez utiliser headpour cela:

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

Il accepte K, M, G et similaires comme suffixes (les octets sont la valeur par défaut). Ajoutez «B» pour utiliser les versions de base 10.

Eduardo Ivanec
la source
tête contre le mur Rien de plus simple. Merci!
mdrozdziel
2
Cela semble tail -c 1Gégalement fonctionner, utile pour regarder la queue d'un événement. Naturellement, il se vide après la fin de la commande.
dashesy
L'unité pour les suffixes ne fonctionne pas sous Mac OS.
anumi
0

Définissez la taille de fichier maximale pour un utilisateur qui ne sera utilisé que pour exécuter ces scripts.

Le fichier /etc/security/limitslimite un utilisateur avec les valeurs "par défaut" sauf s'il existe des valeurs explicites pour un utilisateur spécifique. Ces valeurs spécifiques à l'utilisateur remplaceront les valeurs par défaut. Le fichier peut avoir un nom légèrement différent selon votre système d'exploitation.

Si votre utilisateur de journal est nommé log_maker, ajoutez cette ligne au fichier:

log_maker hard fsize 1000000

Le nombre après fsize est la taille de fichier maximale en Ko.

Chris Ting
la source
0

curtail limite la taille de la sortie d'un programme et préserve les derniers X Ko de sortie avec la commande suivante:

run_program | curtail -s 1G myprogram.log

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

REMARQUE: je suis le responsable du dépôt ci-dessus. Partageons simplement la solution ...

Dave Wolaver
la source
0

Vous pouvez limiter n'importe quel fichier avec

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

Écrire la queue directement dans le même fichier fait un fichier vide. Vous devez donc utiliser un fichier temporaire.

Séverin
la source
tail -c 1G myLog.log> myLog.tmp mv myLog.tmp> myLog.log cela va tuer le journal, je pense que vous vouliez utiliser >> au lieu de> ou pas vous?
djdomi
Le but de cette commande est de réécrire le journal avec uniquement le dernier 1G. Le >> devrait être pour la commande précédente: doSomething >> myLog.log; tail -c 1G myLog.log> myLog.tmp; mv myLog.tmp> myLog.log;
Séverin