Простий спосіб обмежити розмір файлу (stdout) на рівні сценарію оболонки?


10

Гаразд, це дуже практичний випадок використання з моєї точки зору.

Скажімо, у мене є якийсь простий oneliner оболонки, який записує вихід у файл. Це може бути просто все, наприклад, tcpdump. Чи є якийсь загальний і тривіальний спосіб переконатися, що вихідний файл не перевищить заданий розмір?

Причиною цього є захист від заповнення всього наявного простору в точці кріплення помилково. Якщо я забуду про сценарій, або він дасть ГБ даних на годину, то ця проста задача налагодження може призвести до потенційного краху системи.

Тепер я знаю про можливості побудови параметрів у деяких інструментах (наприклад, комбінація -W / -C у tcpdump). Те, що мені потрібно, - це дуже загальна безпека.

Довга коротка історія - коли я запускаю сценарій, наприклад:

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

Як переконатися, що output.log ніколи не буде перевищувати 1 Гб.

Сценарій може розбитися, бути вбитим чи чим завгодно.

Я шукаю рішення має бути простим і простим, використовуючи лише інструменти, доступні в популярних дистрибутивах, такі як ubuntu / debian / fedora. Загалом щось широко доступне. Складна, багаторядкова програма тут не є варіантами, незалежно від мови / технології.

Відповіді:


16

Ви можете використовувати headдля цього:

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

Він приймає K, M, G і подібні як суфікси (байти за замовчуванням). Додайте "B", щоб використовувати базові 10 версій.


голова добігає стіни Це не могло бути простішим. Дякую!
mdrozdziel

2
Здається, це tail -c 1Gтакож працює, корисно подивитися на хвіст події. Зрозуміло, що він спалахує після завершення команди.
дефіс

Блок для суфіксів не працює в Mac OS.
анумі

0

Встановіть максимальний розмір файлу для користувача, який буде використовуватися лише для запуску цих сценаріїв.

Файл /etc/security/limitsобмежує користувача значеннями "за замовчуванням", якщо немає конкретних значень для конкретного користувача. Ці значення для користувача замінять значення за замовчуванням. Файл може мати дещо інше ім’я залежно від вашої ОС.

Якщо ваш користувач журналу названий log_maker, додайте цей рядок у файл:

log_maker hard fsize 1000000

Кількість після fsize - це максимальний розмір файлу в КБ.


0

обмеження обмежує розмір виходу програми і зберігає останній X KB виводу за допомогою наступної команди:

run_program | скоротити -s 1G myprogram.log

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

ПРИМІТКА. Я підтримую вищевказаний репо. Просто ділитися рішенням ...


0

Ви можете обмежити будь-який файл за допомогою

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

Запис хвоста безпосередньо в один і той же файл робить порожній файл. Тому потрібно використовувати тимчасовий файл.


хвост -c 1G myLog.log> myLog.tmp mv myLog.tmp> myLog.log це вб'є журнал, я думаю, ви хотіли використовувати >> замість> або не зробили?
djdomi

Мета цієї команди - переписати журнал лише з останнього 1G. >> повинен бути для попередньої команди: doSomething >> myLog.log; хвіст -c 1G myLog.log> myLog.tmp; mv myLog.tmp> myLog.log;
Северин
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.