我在 Ubuntu 16.04 下的 VPS 上使用 Apache 2.4.18 下的 mod_perl 脚本。脚本从磁盘打开文件(网页模板)。有时,它们会停止查看这些文件,服务器错误日志中充满了以下错误:
[TIME] [:error] [pid PID:tid TID] 文件错误 - FILENAME: 未找到\n
当 Perl 函数返回 false 时,Template 包会生成这些消息open()
。Apache 重新启动后,文件再次可见,但只持续一段时间。过了一会儿,问题又出现了。
这种行为的原因是什么?
答案1
也许 mod_perl/apache 没有正确关闭文件句柄。一段时间后,当达到打开文件的最大数量(1024 个软文件/4096 个硬文件,请参阅ulimit -Sn;ulimit -Hn
)时,apache 重新启动会关闭所有过时的句柄。
下次发生错误时,您可以通过从 apache/perl 获取 pid 来研究这个理论。
# ps aux | grep apache
或者
# pidof apache
或者 perl 模块(如果它有自己的进程)..
示例输出:
28294
列出由 PID 打开的文件
# lsof -p 28294
# lsof -a -p 28294
# counting
# lsof -a -p 28294| wc -l
或者
# cd /proc/28294/fd
# ls -l | less
# count open files with
# ls -l | wc -l