Усечение файла во время его использования (Linux) - PullRequest
33 голосов
/ 11 июня 2009

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

Мои обычные методы усечения файла, например

cp /dev/null file

не работает, предположительно, потому что процесс использует его.

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

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

РЕДАКТИРОВАТЬ перенаправление по файлу, похоже, имеет ту же проблему, что и копия выше - файл возвращается к своему предыдущему размеру при следующей записи:

ls -l sample.log ; echo > sample.log ; ls -l sample.log ; sleep 10 ; ls -l sample.log
-rw-rw-r-- 1 user group 1291999 Jun 11  2009 sample.log
-rw-rw-r-- 1 user group 1 Jun 11  2009 sample.log
-rw-rw-r-- 1 user group 1292311 Jun 11  2009 sample.log

Ответы [ 13 ]

2 голосов
/ 11 июня 2009

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

kill -HUP [идентификатор процесса]

А потом снова начнёт писать.

В качестве альтернативы (как предположил Билли) может быть перенаправление вывода из приложения в программу регистрации, такую ​​как multilog или ту, которая обычно используется с Apache, известной как cronolog. Тогда у вас будет более точный контроль того, куда все идет, прежде чем оно будет записано в тот начальный дескриптор файла (файл), который на самом деле и все.

1 голос
/ 27 ноября 2016

У меня была похожая проблема, и я не смог выполнить "tail -f" на выходе скрипта, запущенного из cron:

    * * * * * my_script >> /var/log/my_script.log 2>&1

Я исправил это, изменив перенаправление stderr:

    * * * * * my_script >> /var/log/my_script.log 2>/var/log/my_script.err
1 голос
/ 12 июня 2009

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

...