Сценарій оболонки Unix для усічення великого файлу


87

Я намагаюся написати скрипт Unix, який скорочуватиме / спорожнять файл, який постійно пише / відкриває програма, коли він досягає 3 Гб місця. Я знаю, що це зробить команда нижче:

cp /dev/null [filename]

Але я збираюся запустити це у виробничому середовищі автоматично як роботу cron - просто розміщуючи тут повідомлення, щоб побачити, чи не стикалися ви з хлопцями, роблячи щось подібне до цього.


Це прод. журнали не мають значення? Мені пощастило вести свої виробничі журнали протягом року + (у bzip2 -9 fmt) і мав кілька невеликих утиліт, які полегшували витяг виконання робочого часу, оброблених записів, а при завантаженні в електронну таблицю було легко розрахувати та завантажити графік коефіцієнтів і купу речей. Ми виявили проблему hdwr через падіння коефіцієнтів навантаження. Так, там є чудові інструменти моніторингу, тому все залежить від вашої ситуації. Як ОКРЕМИЙ ВАРІАНТ, якщо ви розглядали logrotate, він може надати вам якесь значення (але дратуйте при його налаштуванні (просто здогадуючись)!).
обстріл

5
Зверніть увагу, що якщо файл журналу відкрито з прапором O_APPEND, то скорочення ефективне. Якщо його не відкрити прапором O_APPEND, програма продовжить запис із зміщенням 3 ГіБ (перший раз); система буде обробляти перші 3 Гб як нуль у байтах (що добре стискається), але файл буде продовжувати рости. Все залежить від програми, яка пише журнал.
Джонатан Леффлер

Відповіді:


116

Просто щоб додати ще одну відповідь,

: > filename

: є відсутністю в bash (сумісно з POSIX), тому це, по суті, просто відкриває файл для запису (що, звичайно, скорочує файл), а потім негайно закриває його.

EDIT: як зауважив shellter, вам насправді не потрібна команда, яка відповідає перенаправленню:

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

Просте перенаправлення само собою очистить файл.


25
або просто > filename(як я впевнений, ви знаєте). Всім удачі.
обстріл

5
@shelter "$> файл" не POSIX і не портативний. Вам слід використовувати команду ":" no-op перед перенаправленням, як спочатку пропонувалось.
Аарон Топонс

2
+ плюс для смайлика
Кріс Сушинський

2
Як зазначив @AaronToponce, "$> файл" справді не є портативним; на моїй установці Zsh це робить оболонку зависати (нібито чекає введення). "$:> файл" працює у Zsh просто чудово.
Лінус Арвер,

1
@TechEnthusiast Це залежить від ваших очікувань. Зрізання саме по собі є атомним, але ви насправді не знаєте, коли це відбудеться щодо будь-якого конкретного запису. Наприклад, можна накрутити частковий рядок на початку файлу.
chepner

65

Я використав таку команду на debian

truncate -s 0 filename

@SteveClay: sudo sh -c ': > filename'також filename
усіче

2
@SteveClay ППО пропозицію також працює бездоганно sudo: sudo cp /dev/null filename. Також cpє портативним, хоча truncateє лише сучасним Linux.
Тіно

11

Це здається мені розумним. Звичайно, Unix дозволить вам зробити це приблизно 50 різними способами. Наприклад,

echo -n "" >filename
cat /dev/null >filename

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.