在一个系统中程序每隔5分钟会通过ProcessBuilder创建进程执行shell脚本。系统运行一段时间后,会报以下错误:

java.io.IOException: Cannot run program “ssh”: java.io.IOException: error=24, Too many open files at java.lang.ProcessBuilder.start(ProcessBuilder.java:460)

通过排查发现是由于进程执行shell脚本后,没有再调用进程的destroy方法。修改后的程序如下:

修改后系统运行不再报错。
关于此问题,具体原因如下:
Linux系统对于每个进程能打开的最大文件数有限制(一般为65535,可使用“ulimit -n”命令查看该值)。当通过ProcessBuilder创建进程时,STDIN、STDOUT、STDERR会和Java主进程通过输入、输出流建立管道连接,从而占用文件描述符,当进程执行结束后,若不关闭输入、输出流和销毁进程,则会造成Java主进程文件描述符的泄露。因此,需要在进程执行结束后,关闭输入、输出流,销毁进程。

基于WebSocket实现微信小程序的消息推送

微信小程序支持通过基于WebSocket进行消息推送,提供了相应的API,例如创建连接示例代码: JavaScript wx.connectSocket({ ...

阅读全文

基于nginx-sticky-module-ng实现会话保持(Sticky Sessions)

对服务进行集群部署,前端进行负载均衡时,需要实现会话保持,对于同一会话的多个请求,通过集群中的一个节点来提供服务。系统的部署结构如图所示,通过Resin...

阅读全文

ActiveMQ基于Zookeeper和LevelDB实现Master/Slave

ActiveMQ的Master/Slave目前支持三种实现方式: 1)Shared File System Master Slave; 2)JDBC Master Slave; 3)Replicated LevelDB Store。 对于第三种方...

阅读全文