我有一个正在泄漏文件描述符的 Java 进程(Glassfish)。我知道这一点,因为我得到了有用的java.io.IOException: Too many open files例外。我可以/proc/PID#/fd查看所有打开的文件描述符。当我使用 lsof 时,我得到了大量这样的条目:
java 18510 root 8811u sock 0,4 1576079 无法识别协议
java 18510 root 8812u sock 0,4 1576111 无法识别协议
java 18510 root 8813u sock 0,4 1576150 无法识别协议
我看到每分钟创建 12 个新的。我可以在 lsof 上使用哪些选项或我可以使用哪些其他工具来帮助跟踪无法识别协议的套接字文件描述符?
我们在远程服务器上有一个长时间运行的进程,该进程不时手动启动。不幸的是,互联网连接中断、内核恐慌以及用于连接和启动工作的 ssh 会话可能会遇到许多其他挑战。
Screen 似乎是确保过程不被中断的完美方式。然而,依靠一个人总是记得启动屏幕然后运行脚本来启动进程是一个等待发生的问题。有没有办法从脚本中检查脚本是否在屏幕内被调用?如果是,则该过程将继续,否则脚本将退出并显示一条消息,指示用户首先运行 screen。
不幸的是,我们有一个客户端硬编码了一个设备以指向特定的 IP 和端口。我们希望将流量从他们的 IP 重定向到我们的负载均衡器,负载均衡器会将 HTTP POST 发送到能够处理该请求的服务器池。我希望来自所有其他 IP 的现有流量不受影响。
我相信 iptables 是实现这一目标的最佳方式,我认为这个命令应该可以工作:
/sbin/iptables -t nat -A PREROUTING -s $CUSTIP -j DNAT -p tcp --dport 8080 -d $CURR_SERVER_IP --to-destination $NEW_SERVER_IP:8080
Run Code Online (Sandbox Code Playgroud)
不幸的是,它没有按预期工作。我不确定是否需要在POSTROUTING链中添加另一条规则?
下面我用真实的 IP 替换了上面的变量,并尝试在我的测试环境中逐步复制布局。
$CURR_SERVER_IP = 192.168.2.11
$NEW_SERVER_IP = 192.168.2.12
$CUST_IP = 192.168.0.50
Run Code Online (Sandbox Code Playgroud)
端口转发在同一个 IP 上
/sbin/iptables -t nat -A PREROUTING -p tcp -d 192.168.2.11 --dport 16000 -j DNAT --to-destination 192.168.2.11:8080
Run Code Online (Sandbox Code Playgroud)
完全按预期工作。
IP 和端口转发到不同的机器
/sbin/iptables -t nat -A PREROUTING -p tcp -d 192.168.2.11 --dport 16000 -j DNAT --to-destination …Run Code Online (Sandbox Code Playgroud)