我需要在Solaris中旋转一些Tomcat日志。 当我尝试使用-c选项使用logadm时,旋转似乎正确地发生,但是然后catalina.out成为与旋转部分大小相同的空值块,并且在这些空值之后写入新数据。 就好像文件位置指针从不移动,Tomcat的输出从相同的位置继续前进。
结果,catalina.out继续增长。 每个旋转事件都会导致空值的增长。
当它工作时,这是我所知道的最方便的日志旋转解决scheme,因为您不必修改catalina.sh。 但是它不起作用,而替代方法 – 通过Apache logrotatepipe道输出 – 需要修改catalina.sh,我不想这样做。 这意味着我们每次更新Tomcat时都会跟踪另一个本地更改。
其实, catalina.sh
确实打算用O_APPEND
打开catalina.out
: >> "$CATALINA_OUT" 2>&1 &
根本原因是shell: #!/bin/sh
。 Solaris的默认shell( /bin/sh
)不能正确解释>>
以用O_APPEND
打开输出文件。
这在Linux上不是问题。 你可以使用符合标准的shell来解决Solaris问题: /usr/xpg4/bin/sh
(参见man sh
)
修改catalina.sh
并用#!/usr/xpg4/bin/sh
replace#!/bin/sh
#!/usr/xpg4/bin/sh
。 缺点是每次更新Tomcat时,都需要重做。
使用O_APPEND
或者不使用pfiles
命令来validationcatalina.out
是否被打开是容易的。
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
使用O_APPEND
打开catalina.out
。
正是这样; Tomcat(catalina.sh,具体而言)不会使用O_APPEND打开它的日志文件,因此写入发生在前一个位置,创build一个洞(空值,不占用磁盘空间)。
一个选项是在循环后有一个post_command来重启Tomcat。
另一个是使catalina.out命名pipe道,并从中读取一个程序,做“正确的事情”。 这个缺陷是,如果程序没有运行,Tomcat会填满pipe道缓冲区,然后阻塞,直到耗尽。