Назад | Перейти на главную страницу

Есть ли способ удалить / обрезать файл во время записи в него процесса?

У нас есть сервер apache, работающий на Linux, который записывает в файл журнала, который становится очень большим (access_log). Нашему серверу станет не хватать места. Есть ли способ удалить или обрезать файл без перезапуска сервера (мы не хотим простоев).

Как сбросить файлы журнала

Рано или поздно вам захочется сбросить файлы журнала (access_log и error_log), потому что они слишком велики или полны старой информации, которая вам не нужна.

access_log обычно увеличивается на 1 МБ на каждые 10 000 запросов.

Большинство людей первая попытка заменить файл журнала - это просто переместить файл журнала или удалить файл журнала. Это не работает.

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

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

Apache сигнализируется с помощью SIGHUP (-1) сигнал. например

mv access_log access_log.old
kill -1 `cat httpd.pid` 

Примечание: httpd.pid - это файл, содержащий идентификатор процесса демона Apache httpd, Apache сохраняет его в том же каталоге, что и файлы журнала.

Многие люди используют этот метод для замены (и резервного копирования) своих файлов журнала каждую ночь или каждую неделю.

http://httpd.apache.org/docs/1.3/misc/howto.html#logreset

Обнулить файл журнала ...

# :>filename

Ротация журналов - долгосрочное решение, но ответ на ваш непосредственный вопрос - обрезать файл примерно так:

sudo cat /dev/null > /var/log/httpd/access_log

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

Если вы хотите обрезать / обнулить файл журнала, к которому у вас нет доступа на запись, вы можете сделать

sudo truncate -s0 logfile

Попробуйте использовать logrotate

  • это мощный инструмент, который дает настраиваемые параметры для ротации журналов.
  • у него также есть возможность запускать команду во время prerotate и postrotate
  • copytruncate позволяет копировать существующие файлы и затем обрезать их. При желании копию можно переместить в другое хранилище, такое как hadoop, s3, для резервного копирования.
  • Кроме того, можно установить cron, например /usr/sbin/logrotate --force /etc/logrotate.hourly.conf 2>&1 >> /tmp/logger используя /etc/cron.hourly/logrotate

Для получения дополнительной информации man logrotate

Просто вы можете сделать сначала $ cat filename >bkp_filename чем он создаст копию "filename", чем обнулит исходный файл, например $ >filename он уменьшится до нулевого размера, теперь сделайте zip до bkp_filename, например $ gzip bkp_filename так что он обеспечит больший размер, и ваша точка монтирования теперь зеленая

Была такая же проблема с процессом и исправлена ​​с помощью именованного канала Linux. Вот что я сделал (при условии, что /tmp/job.log - это файл журнала):

  1. Остановить работу
  2. rm /tmp/job.log
  3. создал именованный канал с помощью mkfifo: mkfifo /tmp/job.log
  4. побежал: cat /tmp/job.log | gzip> /tmp/job.log.gz
  5. Начать работу

Таким образом, я смог сохранить журнал и значительно сократить использование диска.

вы можете заменить gzip любой командой, которая фильтрует, вращает, ...