我们有一个基于 java 的 Web 应用程序在 CentOS 6.0 64 位上运行,它会写出许多日志文件。logrotate
使用daily
、copytruncate
和其他几个选项每天轮换一些文件。
一个这样的特定日志文件在恰好“102400000”字节时停止增长。该过程继续正常运行。但那时日志中没有写入任何内容。
我stat
对文件做了一个操作watch
,查看在达到“102400000”字节大小后修改时间是否发生变化,但事实并非如此。文件没有任何反应。它只是保持原样。继续写入同一目录中的其他日志文件。
另一个 StackExchange 问题中提到的事情这里请勿应用。我检查并重新检查是否设置了提到的 ulimit 选项,但没有任何设置。
执行strace -f -p PID
显示该进程正在尝试写入,但遇到“文件太大”和“超出文件大小限制”消息:
[pid 5679] write(1, "\n\n\n\n\n23-01-2013 12:00:46:921 Av"..., 128) = -1 EFBIG (File too large)
[pid 5679] --- SIGXFSZ (File size limit exceeded) @ 0 (0) ---
我如何找到对文件大小施加此限制的原因。同一目录中的其他日志文件非常大(大小大于 1Gb),并且没有此类问题。
答案1
因此(根据您的评论),毕竟ulimit
(导致SIGXFSZ
和EFBIG
)解释了为什么日志的大小不能变得更大。
您可以通过以下方式确认:
grep 'Max file size' "/proc/$pid/limits"
(其中$pid
是要写入该文件的 java 进程的 id)。
它可能是由进程本身设置的(在 strace 输出中检查setrlimit
或),也可以由启动的包装脚本或 java 应用程序设置(查找)。ulimit
java
ulimit -f 100000