![套接字上打开的文件过多](https://linux22.com/image/1345193/%E5%A5%97%E6%8E%A5%E5%AD%97%E4%B8%8A%E6%89%93%E5%BC%80%E7%9A%84%E6%96%87%E4%BB%B6%E8%BF%87%E5%A4%9A.png)
我有一个大问题,那就是我公司的生产应用程序不幸无法关闭并重新启动(我不确定如何关闭,而且我不想犯任何错误),当尝试打开套接字从 ftp 服务器读取时,由于打开了太多文件而引发大量异常。
2013-01-02 16:19:03,222 ERROR [main] software.background.Program(Program.java:doExecute{225}) - Exception during ftp transfer
someclasses.ftp.FtpException: Could not create connection to xxxx
at someclasses.communication.ftp.FtpImpl.connect(FtpImpl.java:114)
at Program.doExecute(Program.java:176)
at Program.main(Program.java:287)
Caused by: java.net.SocketException: Too many open files
at java.net.Socket.createImpl(Socket.java:397)
at java.net.Socket.<init>(Socket.java:371)
at java.net.Socket.<init>(Socket.java:189)
at someclasses.Ftp.connect(Ftp.java:386)
我了解每个应用程序打开的文件/套接字等的限制已达到。有没有办法在不关闭应用程序的情况下暂时增加此最大值?我运行了该命令ulimit
,它显示unlimited
。我尝试检查使用该命令打开了多少个连接,lsof -p PID
但它显示“未找到命令”。
如果有人能帮我找到 lsof 的另一个类似效果(我认为是一台红帽机器)并建议如何暂时修复此问题,我将非常高兴。对此最令人满意的解决方案是增加应用程序可以打开的文件/套接字。这只是一个普通的 Java 应用程序。
提前致谢!
编辑 另一个解决方案是,如果有任何命令,我可以从一开始就查找该程序是如何运行的,以及所有最终标志。然后我可能可以成功重新启动它。这是一个遗留应用程序。
答案1
最终,应用程序重新启动。我将 ulimit -n 更改为 2048,并重新加载配置。但是,所有进程都继承了旧配置,应用程序必须重新启动。