lsof是一个增强的强大的命令行实用程序,适用于unix系统.它列出了打开的文件,显示有关它们的信息.由于大多数内容都是unix系统上的文件,因此lsof可以为系统管理员提供大量有用的诊断数据.
有哪些使用lsof最常用和最有用的方法,以及使用哪些命令行开关?
我希望能够跟踪文件,看看哪个进程正在触摸该文件.那可能吗?我知道我可以在活动监视器中看到打开进程的列表,但我认为很快就能让我看到它.原因是我正在使用框架,我认为正在使用框架的系统版本而不是调试版本,我想看看哪个进程正在触及它.
如何lsof
生成数字端口信息而不是尝试将端口解析为服务名称?
例如,我想在事实上TCP *:http (LISTEN)
给我TCP *:80 (LISTEN)
,如果可能的话,我再也不想在lsof
打印输出中看到另一个服务名称了.因此,如果有一种方法可以使数字端口成为默认值,我也想了解如何做到这一点.
在Linux上,ulimit -n
可用于更改或查看进程的文件描述符数量限制,并且lsof -p nnn | wc -l
似乎始终报告实际的文件描述符用法.
但是在Mac OS X上,lsof -p nnn | wc -l
可以返回高于限制的数字.我想这意味着lsof
返回的不仅仅是文件描述符,但我不知道是什么.
结论:如何在Mac OS X中准确计算文件描述符的使用情况?
您可以使用命令lsof来获取所有正在运行的进程的文件描述符,但我想要做的是关闭其中一些描述符,而不是在该进程内部.这可以在Windows上完成,因此您可以轻松取消阻止某些应用程序.
那有什么命令或功能吗?
我有一个Java进程/应用程序.当我在那个java进程上运行/ usr/sbin/lsof -p时,我看到很多"无法识别协议".另外,有趣的是,文件描述符(FD)以非常稳定的速率增加.正在创建的FD正在描述为"无法识别协议".
那么,有没有办法对java进程进行检测/分析,以便确定谁在创建那么多FD.任何工具的任何详细解释都会非常有用.
一个快速的谷歌搜索告诉我strace是一种方式,但IIUC,将显示来自java进程的Linux系统调用.我更感兴趣的是我的java代码的哪一部分比正在生成的系统调用表现得差.
同样,任何想法/建议都会很棒!
我有一个长期运行的python脚本与perl worker子进程.数据通过stdin和stdout发送进出子进程.必须定期重新启动孩子.
不幸的是,经过一段时间的运行,它耗尽了文件('太多的打开文件').lsof显示了许多剩余的开放管道.
在Popen'd过程之后清理的正确方法是什么?这就是我现在正在做的事情:
def start_helper(self):
# spawn perl helper
cwd = os.path.dirname(__file__)
if not cwd:
cwd = '.'
self.subp = subprocess.Popen(['perl', 'theperlthing.pl'], shell=False, cwd=cwd,
stdin=subprocess.PIPE, stdout=subprocess.PIPE,
bufsize=1, env=perl_env)
def restart_helper(self):
# clean up
if self.subp.stdin:
self.subp.stdin.close()
if self.subp.stdout:
self.subp.stdout.close()
if self.subp.stderr:
self.subp.stderr.close()
# kill
try:
self.subp.kill()
except OSError:
# can't kill a dead proc
pass
self.subp.wait() # ?
self.start_helper()
Run Code Online (Sandbox Code Playgroud) 我尝试在端口7054上启动Python SimpleHTTPServer:
$ sudo python -m SimpleHTTPServer 7054
...
socket.error: [Errno 98] Address already in use
Run Code Online (Sandbox Code Playgroud)
所以,我运行了以下命令:
$ sudo netstat -ntpu | grep 7054
$ sudo lsof -i -n -P | grep 7054
Run Code Online (Sandbox Code Playgroud)
但我没有结果.
我在服务器上运行了30个进程实例,并希望为每个进程记录打开的文件以进行分析.
我运行了以下命令:
* ps auwwx | grep PROG_NAME | awk '{print $2}' | xargs lsof -p | less
Run Code Online (Sandbox Code Playgroud)
它抱怨说,"lsof:状态错误:没有这样的文件或目录"
但是,如果我运行lsof -p < pid >
它,则为我提供该进程的打开文件列表.如何在FreeBSD计算机上获取该进程的所有30个实例的所有打开文件的列表.
此外,我不希望列出共享库.如果我这样做-d "^txt"
不显示我想要显示的其他数据库文件.有没有其他方法可以查出.so文件?
我正在使用以下命令获取管道列表:
lsof | grep PIPE
Run Code Online (Sandbox Code Playgroud)
我想知道FD列的值是什么意思(第5页http://i.imgur.com/KHczptf.png).我认为,r
和w
平均读取和写入分别,但到底是什么下面的每一个字符,这些装置的数量?
我知道FD意味着文件描述符,我想弄清楚的是列中显示的值是什么意思,比如3r,16w,20r等.