Catalina.out не регистрируется после редактирования скриптом bash

Это установка tomcat7 с конфигурацией ведения журнала по умолчанию, catalina.out развертывается только при перезапуске сервера. Поскольку это рабочий сервер, мы не можем часто перезапускать его. У нас есть огромное количество записей, поступающих в этот файл, из-за чего наш файл catalina.out очень сильно растет за несколько дней, пока не займет все дисковое пространство.

Поскольку мы не хотим менять конфигурацию ведения журнала, поскольку она кукольная, и нам нужно будет создавать билеты devops и все такое медленное, я написал сценарий bash, который запускается каждые 5 минут через crontab, который будет сокращать файл журнала на половине, когда предел достигнут, сценарий выглядит следующим образом:

 if [ $catalinaSize -gt $catalinaThreshold ]; then
  middle=$(wc -l $catalinaLoc | awk '{ print $1 }')
  middle=$(( $middle / 2 ))
  sed -i -e 1,${middle}d $catalinaLoc
  echo "+++ catalina.out was cut by half"

По сути, этот сценарий проверяет текущий размер файла и сравнивает его с пороговым значением, а затем использует wc и awk для получения количества строк в этом файле, чтобы затем использовать sed для сокращения файла наполовину.

Я протестировал скрипт в других средах, и он работал. Проблема заключается в том, что после нескольких успешных запусков в течение нескольких дней в производственной среде catalina.out внезапно не получает никаких записей журнала от tomcat несколько дней назад.

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

Можно ли узнать, что мешает Tomcat записывать в этот файл?


person raspacorp    schedule 13.02.2015    source источник


Ответы (1)


Я подозреваю, что sed -i наносит ущерб: за кулисами он записывает выходной поток во временный файл, а затем перемещает временный файл в исходное имя. Я подозреваю, что дескриптор файла, хранящийся в Catalina, больше не указывает ни на какой файл.

Вам придется найти способ фактически редактировать файл, а не заменять его. Это может быть допустимой заменой для sed:

printf "%s\n" "1,${middle}d" "wq" | ed "$catalinaLoc"

Касательно, более простой способ получить количество строк:

middle=$(( $(wc -l < "$catalinaLoc") / 2 ))

Когда вы перенаправляете на wc, он больше не печатает имя файла.

person glenn jackman    schedule 13.02.2015