У меня есть скрипт bash, который работает, пока машина Linux включена. Я начинаю это, как показано ниже:
( /mnt/apps/start.sh 2>&1 | tee /tmp/nginx/debug_log.log ) &
После этого я вижу команду tee в выводе ps, как показано ниже:
$ ps | grep tee
418 root 0:02 tee /tmp/nginx/debug_log.log
3557 root 0:00 grep tee
У меня есть функция, которая контролирует размер журнала, который генерирует tee, и убивает команду tee, когда журнал достигает определенного размера:
monitor_debug_log_size() {
## Monitor the file size of the debug log to make sure it does not get too big
while true; do
cecho r "CHECKING DEBUG LOG SIZE... "
debugLogSizeBytes=$(stat -c%s "/tmp/nginx/debug_log.log")
cecho r "DEBUG LOG SIZE: $debugLogSizeBytes"
if [ $((debugLogSizeBytes)) -gt 100000 ]; then
cecho r "DEBUG LOG HAS GROWN TO LARGE... "
sleep 3
#rm -rf /tmp/nginx/debug_log.log 1>/dev/null 2>/dev/null
kill -9 `pgrep -f tee`
fi
sleep 30
done
}
К моему удивлению, команда kill tee также уничтожает экземпляр start.sh. Почему это? Как я могу завершить команду tee, но мой start.sh продолжает работать? Благодарю.
tee -a
дляtee
открытия файла в режиме добавления, в противном случае tee продолжит запись в файл с тем же смещением после его усечения (и в системах, которые не поддерживают разреженные файлы, как в macOS, которые будут перераспределить часть файла, ведущую к этой позиции, занимая вдвое больше дискового пространства).logger -s
каналу для syslog, чтобы позаботиться о регистрации (-s
также распечатать на stderr).logrotate
. Отличная программаОбъясняя «почему»
Вкратце: если сбой записи не привел к выходу программы (по умолчанию), у нас будет беспорядок. Подумайте
find . | head -n 10
- вы не хотитеfind
продолжать работать, сканируя оставшуюся часть жесткого диска, после того, какhead
уже взяли 10 необходимых строк и продолжили.Делая это лучше: вращайте внутри своего регистратора
Рассмотрим следующее, которое вообще не используется
tee
, в качестве наглядного примера:Если запустить как:
... это начнется с добавления
/tmp/nginx/debug_log
, переименования файла,/tmp/nginx/debug_log.old
когда присутствует более 100 КБ содержимого. Поскольку сам регистратор выполняет ротацию, в нем нет ни разорванного канала, ни ошибки, ни окна потери данных, когда происходит ротация - каждая строка будет записана в тот или иной файл.Конечно, реализация этого в native bash неэффективна, но вышеприведенный пример является иллюстративным. Существует множество доступных программ, которые реализуют вышеуказанную логику для вас. Рассмотреть возможность:
svlogd
, сервисный регистратор из набора Runit.s6-log
, активно поддерживаемая альтернатива из набора Сканет.multilog
от DJB Daemontools, дедушки этого семейства инструментов контроля и мониторинга процессов.источник