Как связать файл журнала с / dev / null и автоматически восстановить используемое пространство

Rsync является абсолютно соответствующим решением здесь. ответ @jellefoks' касается, большинство как сделать это, я хотел бы добавить, что я использую rsync для резервного копирования 20 + ТБ NAS более чем 1 ГБ к другому NAS, и требуется примерно 1,5 часа, чтобы сделать это ночью. Так использование 100 МБ, это, очевидно, будет медленнее, но, учитывая Ваши размеры набора данных это должно быть абсолютно приемлемо.

Единственный протест с rsync то, если природа данных будет такова, что это - много файлов, то затем это, очевидно, займет больше времени, чем если они будут меньшим количеством больших файлов. Существует некоторая оптимизация, с которой можно сделать rsync чтобы сказать этому сравнивать файлы на основе метки времени и размера по сравнению с контрольной суммой для улучшения, это - производительность.

Наконец я хотел бы предложить использовать BackupPC. Это дает Вам опцию использования множества методов для резервного копирования, (Samba, rsync, и т.д.), но это - истинное значение, веб-отчеты. Они чрезвычайно полезны в наблюдении, если резервное копирование работало и сколько времени оно взяло.

   ss of backuppc report

4
08.09.2015, 00:49
4 ответа

Содержимое файла удаляется только тогда, когда на него больше нет ссылки. Ссылка на файл может быть записью каталога или дескриптором открытого файла. Когда вы удаляете файл (например, с помощью команды rm ), который все еще открыт для процесса (в данном случае, процесс, который ведет журнал), содержимое файла остается до тех пор, пока процесс не закроет файл.

Самый простой способ избавиться от старых журналов - это

  1. Переместить файл под другое имя, например mv foo.log foo.log.old
  2. Указать процессу повторно открыть файл журнала. Если у процесса нет возможности сделать это, перезапустите его.
  3. Удалите закрытый старый файл журнала ( rm foo.log.old ).

Программа logrotate автоматизирует этот механизм и может быть настроена на то, сколько дней хранить старые журналы. Он также может сжимать старые журналы.

Для шага 2, если вы не можете перезапустить программу и у нее нет возможности повторно открыть свой файл журнала, вы можете попробовать принудительно заставить его повторно открыть файл журнала с помощью отладчика. Однако имейте в виду, что это может привести к сбою программы, если она хранит информацию о файле журнала, который теперь становится несогласованным. Доказательство концепции (помните, что многое может пойти не так с этим; если есть сомнения, просто не делайте этого):

gdb -n $pid -batch -x /dev/stdin <<EOF
call close(2)
call open("/path/to/foo.log", 1)
EOF

Альтернативный грубый метод для освобождения некоторого дискового пространства, если вас не волнует что-либо из журналы - это усечение файла. Процесс регистрации будет продолжать запись в той же позиции в файле, но файл станет разреженным файлом . Если вы читаете файл с самого начала, вы получите нулевые байты, но эти нулевые байты занимают на диске всего несколько килобайт.

dd if=/dev/null of=/path/to/foo.log
4
27.01.2020, 20:49

С POSIX awk :

#!/usr/bin/awk -f

BEGIN {
    print ENVIRON["AWKSCRIPT"]
}

Затем:

AWKSCRIPT=test.awk ./test.awk
test.awk
-121--3317-

Перезапустите программу для освобождения удаленного файла. Исследуйте logrotate или т.п., чтобы правильно управлять данными журнала, или настройте программу, чтобы выдать меньшее количество сообщений журнала.

-121--81305-

При удалении файла он фактически не удаляется. Вы его разобщаете. В результате программа, у которой был открыт файл журнала, может получить доступ к файлу журнала до тех пор, пока он не будет закрыт (что редко происходит с файлами журнала).

Теперь, чтобы правильно решить проблему, вы захотите проверить поворот журнала и фильтрацию журнала.

Ротация журналов позволит архивировать, сжимать и удалять файлы на основе набора правил. Так, например, все записи старше одного дня сжимаются, а все записи за 7 дней удаляются.

Фильтрация журнала просто уменьшает количество «вещей», которые попадают в журнал. Некоторые программы вы реализуете фильтрацию на стороне программы, другие на стороне регистратора. Если вы используете, например, syslogd, вы можете указать, чтобы он отфильтровывал некритические сообщения по каждой вещи (например, снова).

Чтобы быстро устранить проблему, перезапустите службу, узнайте, реагирует ли она на сигнал SIGUSR1 и SIGHUP довольно распространены, и отправьте его, или перезапустите компьютер.

2
27.01.2020, 20:49

Если файл журнала создается путем вывода на stderr или stdout , и если вы можете контролировать способ, которым программа создает файл журнала (назовем его ] bar ) запускается, запустите его с bar &> / dev / null , который перенаправит все стандартные выходные данные или сообщения об ошибках в / dev / null.

В качестве альтернативы (и я знаю, что это действительно плохая практика, но, по крайней мере, она будет работать) настроить почасовое задание cron, чтобы убить программу, создающую журнал, удалить файл журнала и запустить резервную копию программы при условии, что программа не важна для работы системы. Снова при условии, что имя программы - bar , способ сделать это будет echo "* 0 0 0 0 \" / bin / killall [программа-нарушитель]; / bin / rm [журнал нарушений]; [команда для запуска программы]; \ "1> [расположение crontab]" .

Обратите внимание: квадратные скобки используются для обозначения заполнителей и не должны присутствовать во введенной команде.

Опять же, обратите внимание, что второе решение - действительно плохая практика, и в целом это просто поправка на повязку ... так что используйте его на свой страх и риск.

1
27.01.2020, 20:49

Перезапустите программу, чтобы освободить удаленный файл. Изучите logrotate или аналогичную программу для правильного управления данными журнала или настройте программу так, чтобы она выдавала меньше сообщений журнала.

2
27.01.2020, 20:49

Теги

Похожие вопросы