Мне нужно повернуть некоторые журналы Tomcat в Solaris. Когда я пытаюсь использовать logadm с опцией -c, вращение кажется правильным, но тогда catalina.out становится блоком нулей того же размера, что и вращаемая часть, и новые данные записываются после этих нулей. Это как если бы указатель позиции файла никогда не перемещался, а вывод Tomcat продолжает продвигаться с той же позиции.
В результате catalina.out продолжает расти. Ведущий блок нулей растет с каждым событием вращения.
Когда это работает, это наиболее удобное решение для ротации журналов, которое я знаю, потому что вам не нужно изменять catalina.sh. Но это не работает, и альтернатива - передача вывода через Apache logrotate - требует изменения catalina.sh, чего я бы не стал делать. Это означает еще одно локальное изменение, которое нужно отслеживать каждый раз, когда мы обновляем Tomcat.
Фактически, catalina.sh
намеревается открыть catalina.out
с участием O_APPEND
: >> "$CATALINA_OUT" 2>&1 &
Основная причина - оболочка: #!/bin/sh
. Оболочка по умолчанию Solaris (/bin/sh
) не интерпретирует >>
правильно открыть выходной файл с помощью O_APPEND
.
В Linux это не проблема. Вы можете обойти это для Solaris с помощью совместимой со стандартами оболочки: /usr/xpg4/bin/sh
(видеть man sh
)
Изменить catalina.sh
и заменить #!/bin/sh
с участием #!/usr/xpg4/bin/sh
. Недостатком является то, что каждый раз, когда вы обновляете Tomcat, вам нужно переделывать его.
Легко проверить, действительно ли catalina.out
открывается с O_APPEND
или не используя pfiles
команда.
1: S_IFREG mode:0644 dev:32,5 ino:13738 uid:0 gid:0 size:10170
O_WRONLY|O_APPEND|O_CREAT|O_LARGEFILE
/opt/tomcat6/logs/catalina.out
Ты это видишь /usr/xpg4/bin/sh
открывается catalina.out
с участием O_APPEND
.
Это именно то; Tomcat (в частности, catalina.sh) не открывает свой файл журнала с помощью O_APPEND, и поэтому записи происходят в предыдущей позиции, создавая дыру (нули, не занимая дискового пространства) до этого момента.
Один из вариантов - использовать post_command для перезапуска Tomcat после ротации.
Другой - сделать catalina.out именованным каналом и заставить программу читать из него и делать «правильные вещи». Недостаток в том, что если программа не запущена, Tomcat заполнит буфер канала и затем заблокируется, пока он не будет опустошен.