我写了一小段Java程序,如下所示:
package com.ny.utils.pub;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class NetWriter {
private static String link = "http://xxx.yyyyyy.com:4444";
public String getLink() {
return link;
}
public static void setLink(String link) {
NetWriter.link = link;
}
private static HttpURLConnection conn = null;
private static BufferedReader bufReader = null;
private static InputStreamReader isReader = null;
private static OutputStreamWriter osw = null;
private static URL url = null;
static {
try {
url = …Run Code Online (Sandbox Code Playgroud) 我正在相对较大的代码库中工作,在该代码库中我看到文件描述符泄漏,并且进程开始抱怨在运行某些程序后它们无法打开文件。
尽管这是在6天后发生的,但我可以通过将/ proc / sys / fs / file-max中的值减小为9000来在3-4小时内重现该问题。
随时都有许多进程在运行。我已经能够找出可能导致泄漏的几个过程。但是,我看不到任何文件描述符通过lsof或/ proc // fd泄漏。
如果我杀死了我怀疑泄漏的进程(它们彼此通信),则泄漏消失了。FD被释放。
在while(1)循环中的cat / proc / sys / fs / file-nr显示泄漏。但是,我在任何过程中都看不到任何泄漏。
这是我写来检测泄漏发生的脚本:
#!/bin/bash
if [ "$#" != "2" ];then
name=`basename $0`
echo "Usage : $name <threshold for number of pids> <check_interval>"
exit 1
fi
fd_threshold=$1
check_interval=$2
total_num_desc=0
touch pid_monitor.txt
nowdate=`date`
echo "=================================================================================================================================" >> pid_monitor.txt
echo "****************************************MONITORING STARTS AT $nowdate***************************************************" >> pid_monitor.txt
while [ 1 ]
do
for x in `ps -ef | awk '{ print $2 }'`
do …Run Code Online (Sandbox Code Playgroud) 我正在尝试测试文件是否打开,然后对退出代码执行某些操作。目前是这样做的:
FILE=/usr/local/test.sh
lsof "$FILE" | grep -q COMMAND &>/dev/null
completed=$?
Run Code Online (Sandbox Code Playgroud)
有什么方法可以将退出代码直接推送到局部变量中,而不是将输出重定向到 /dev/null 并捕获“$”?多变的?
我正在使用 linux mint xfce 版本,我的 localhost:80 被某个程序使用,但我不知道是哪一个,当我打开 firefox 并访问 localhost:80 时,它说
有用!这是该服务器的默认网页。Web 服务器软件正在运行,但尚未添加任何内容。
我尝试使用lsof -i @localhost:80,但它什么也没返回。
此问题类似于网络端口打开,但没有附加进程?和netstat显示没有pid的侦听端口,但lsof没有.但是他们的答案无法解决我的问题,因为它太奇怪了.
我有一个服务器应用程序lps,它等待端口8588上的tcp连接.
[root@centos63 lcms]# netstat -lnp | grep 8588
tcp 0 0 0.0.0.0:8588 0.0.0.0:* LISTEN 6971/lps
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,什么是错的监听套接字,但是当我连接几千测试客户端(由另一位同事写的)服务器,无论是2000,3000,或4000一直存在着5个客户端(这也是随机连接并向服务器发送登录请求,但无法接收任何响应.以3000个客户为例.这是netstat命令给出的:
[root@centos63 lcms]# netstat -nap | grep 8588 | grep ES | wc -l
3000
Run Code Online (Sandbox Code Playgroud)
这是lsof命令输出:
[root@centos63 lcms]# lsof -i:8588 | grep ES | wc -l
2995
Run Code Online (Sandbox Code Playgroud)
这5个连接在这里:
[root@centos63 lcms]# netstat -nap | grep 8588 | grep -v 'lps'
tcp 92660 0 192.168.0.235:8588 192.168.0.241:52658 ESTABLISHED -
tcp 92660 0 192.168.0.235:8588 192.168.0.241:52692 ESTABLISHED -
tcp …Run Code Online (Sandbox Code Playgroud) 在Linux 2.6.27中:
从"lsof"输出我看到一个进程保持打开fd与(已删除)文件.奇怪的是,我仍然可以使用"ls"在文件系统中看到该文件.这是为什么?
谢谢.
Tomcat在我的工作站上运行了好几天,现在它没有响应,lsof命令输出大量的close_wait状态连接,tomcat pid是25422,但是ulimit命令显示"打开文件"是1024,这怎么会发生?
[root@localhost home]# lsof -p 25422 | wc -l
10309
[root@localhost home]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 399360
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, …Run Code Online (Sandbox Code Playgroud) 当我在名称列中运行 lsof 命令时,对于套接字,一些数字出现在括号中,如下所示。这是什么意思?
command pid user fd Name
process 8197 root 29 socket:[3050474]
Run Code Online (Sandbox Code Playgroud) 我正在使用以下lsof命令:
lsof -iTCP -a -sTCP:^LISTEN -a -p <pid>
Run Code Online (Sandbox Code Playgroud)
如果有一些输出,则此命令返回退出代码 ,0但如果没有输出,则退出代码是1。
echo $?
Run Code Online (Sandbox Code Playgroud)
谁能解释为什么会这样?有没有办法避免它?
我今天遇到一个问题:
当我启动HDP docker容器时,发生错误:
监听TCP 0.0.0.0:8086:绑定:地址已在使用中
根据错误消息,我知道端口8086已被使用,因此我尝试了一些命令来确定哪个程序正在使用端口8086。
lsof -i:8086
lsof -i tcp:8086
lsof | grep 8086
但是以上所有命令都没有输出!
我对此感到非常困惑,在Google上进行了一些搜索之后,我尝试了另一个命令:
netstat -pna | grep 8086
我从此命令获得正确的输出。
我知道lsof和之间的一些区别netstat,但是我真的不知道为什么我不能从lsof -i:8086?获得任何输出。
这是我从Google搜索到的两个命令之间的一些区别:
netstat(net statistic)是基于连接的,它显示NW连接(udp / tcp端口),路由表,接口,多播成员身份等。
lsof(打开文件列表)是基于应用程序的,类似于netstat + ps,在那里您可以看到所有访问的端口,NW连接等。但是lsof包括诸如本地emacs窗口终端会话(tty dev / pts / n)不属于netstat
lsof ×10
linux ×7
netstat ×2
bash ×1
file ×1
handle ×1
java ×1
kernel ×1
linux-kernel ×1
memory-leaks ×1
networking ×1
port ×1
tomcat ×1
ulimit ×1
unix ×1