我正在尝试获取每个进程的打开文件列表。我从PerlMonks运行了以下单行:
lsof | perl -lane '$x{"$F[0]:$F[1]"}++;
END { print "$x{$_}\t$_" for sort {$x{$a}<=>$x{$b}} keys %x}'
Run Code Online (Sandbox Code Playgroud)
它返回打开文件的总数,以及进程名称和 pid。结果按升序排列,最后一行如下:
1065702 java:15437
Run Code Online (Sandbox Code Playgroud)
所以当我运行时lsof -p 15437,我希望它返回相同的数字,但是我得到:
$ lsof -p 15437 | wc -l
403
Run Code Online (Sandbox Code Playgroud)
为什么会出现差异?
附录
差异的第三个来源:
$ cd /proc/15437/fd
$ ls -1 | wc -l
216
Run Code Online (Sandbox Code Playgroud) 我有一个需要在特定端口上运行的进程。我已经在那个端口上启动了一些其他进程,我需要终止它。
不幸的是,我不记得另一个进程的名称/pid,所以我需要一种快速的方法来找到与其关联的 PID。
我试过了,lsof -i :7080但没有任何回报。我可以,telnet localhost 7080所以我知道它正在运行。
作为参考,我正在运行 RHEL5
当我尝试将分区重新挂载为 时read-only,出现错误/foo is busy。我可以列出所有文件打开/foo与
lsof /foo
Run Code Online (Sandbox Code Playgroud)
但这并没有告诉我文件是打开的read-only还是read-write. 有没有办法只列出打开的文件read-write?
我需要一个进程打开的文件、端口等的列表。现在,每当我使用时lsof -p <PID>,我都可以在 python 脚本中解析输出,但问题是有时我会得到一些空列。因此,我在解析输出时得到了不好的结果。
我知道我可以在 /proc 中为每个进程手动查找 FD,但这必须符合 POSIX 标准。所以我的问题是,有没有办法只lsof打印打开文件的列表,而不打印其他内容?
我正在考虑类似用户特定ps命令(ps -eopid,user,comm,command),我们可以在其中指定输出中出现哪些命令。在本例中,我只想在输出中指定“名称”列lsof -p <PID>。
我有一个运行 Debian Jessie 的 Raspberry Pi。我安装了 pi-hole 来阻止广告服务域 ( https://pi-hole.net )。通过查看日志,我注意到很多来自中文域的查询。
lsof -i显示了以下我认为可疑的列表:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1742 root 3u IPv4 16960 0t0 TCP raspberrypi:ssh->116.31.116.47:50600 (ESTABLISHED)
sshd 1743 sshd 3u IPv4 16960 0t0 TCP raspberrypi:ssh->116.31.116.47:50600 (ESTABLISHED)
sshd 1774 root 3u IPv4 16990 0t0 TCP raspberrypi:ssh->183.214.141.105:56265 (ESTABLISHED)
sshd 1775 sshd 3u IPv4 16990 0t0 TCP raspberrypi:ssh->183.214.141.105:56265 (ESTABLISHED)
sshd 1869 root 3u IPv4 17068 0t0 TCP raspberrypi:ssh->116.31.116.47:33525 (ESTABLISHED)
sshd 1870 sshd 3u IPv4 17068 0t0 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用删除目录
rm -rf dirName
Run Code Online (Sandbox Code Playgroud)
但我收到了一堆错误,例如:
rm: cannot remove 'deleteMe/icarus/.nfs0000001bcf11514a0000cd45': Device or resource busy
Run Code Online (Sandbox Code Playgroud)
当我尝试通过命令查找使用此文件的进程时
lsof deleteMe/icarus/.nfs0000001bcf11514a0000cd45
Run Code Online (Sandbox Code Playgroud)
没有输出。有什么建议么?
我正在一台 Linux(Scientific Linux CERN SLC 版本 6.9 (Carbon))机器上工作,我无法在该机器上安装程序并且lsof或fuser命令不可用。
我正在尝试删除这台机器上的 NFS 点文件,但我一直收到Device or resource busy错误消息,所以我想找出哪个进程(我怀疑它可能是我以前开始使用的进程nohup)仍然具有该文件的文件描述符。
我怎样才能做到这一点?
我lsof用来追踪仍然占用空间的已删除文件,我意识到我不太确定相对于文件的偏移量是什么。lsof的手册页在这方面没有多大帮助,四处搜索我无法清楚地了解它是什么。
什么是文件偏移量,为什么拥有这条信息很有用?
我们一直在努力清理/opt坐骑中的一些空间。空间消耗的一大罪魁祸首是我们运行的某些进程的日志文件(每个进程 2 到 12 GB)。
我们通过截断它们来清理它们。然而,这似乎使我们的输出从df -H.
/dev/mapper/Sys-opt 76G 72G 0 100% /opt
Run Code Online (Sandbox Code Playgroud)
du -sh *在此目录上运行时,大小不会相加。运行时lsof | grep log,我看到我们删除的许多文件仍然显示(deleted)在末尾。
我的问题是,(a) 我应该关心这个吗?(b) 有没有办法让我df -H恢复正常,而无需重新启动盒子/这些过程?重新启动进程是否会修复它(我看到相同日志的多个条目,这些条目来自我知道最近已重新启动的进程)?
我在下面使用此命令并尝试分隔列我只想让 PID 在我的 python 脚本中使用它。
我可以轻松地逐行获取此行,但是如何以非 hacky 的方式将其分成几列?
我可以很容易地按空间分割,但让我们面对这是一个糟糕的主意,有什么建议吗?
root@python-VirtualBox:/var/python# lsof | grep TCP
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 3449 root 3u IPv4 24248 0t0 TCP *:22 (LISTEN)
sshd 3449 root 4u IPv6 24257 0t0 TCP *:22 (LISTEN)
Run Code Online (Sandbox Code Playgroud) 我试图找出我的 Linux Ubuntu 机器上正在使用哪些端口。我正在阅读文章如何检查端口是否在 Linux 或 Unix 上使用,并看到其中一个命令是:
\nsudo lsof -i -P -n | grep LISTEN
我仍然对很多 Linux 命令不太熟悉,但我最近刚刚了解了如何lsof列出所有打开的文件,所以我想了解这些标志的用途。
(-P 和 -n 标志是做什么用的?我已经看过手册,但它\xe2\x80\x99s 根本没有帮助。看来 -i 标志是这里最重要的标志。)
\n我发现如果我在没有 -i 标志的情况下对“LISTEN”执行 grep,我得到的结果与使用的结果完全不同。
\n在手册中,它是这样说的:
\n\n\n-i [i]\n此选项选择其 Internet 地址与 i 中指定的地址匹配的文件列表。如果未指定地址,则此选项将选择所有 Internet 和 x.25 (HP-UX) 网络文件的列表。
\n
我真的不明白这意味着什么,并且绝对不明白它如何帮助我找出正在使用的端口。
\n如果我尝试卸载已安装的磁盘。它说我不能,因为它被另一个进程使用,这很奇怪,因为我找不到任何可以访问它的东西。所以我尝试使用 lsof 来查找正在使用它的内容。结果如下
我不能因为 bash。嗯,这是有史以来最通用的信息。我怎样才能找到具体使用它的内容?
当我们运行 lsof 来捕获已删除的文件时,
我们看到以下内容:(示例)
lsof +L1
java 193699 yarn 1760r REG 8,16 719 0 93696130 /grid/sdb/hadoop/hdfs/data/current/PLP-428352611-43.21.3.46-1502127526112/current/path/nbt/dir37/blk_1186014689_112276769.meta (deleted)
Run Code Online (Sandbox Code Playgroud)
尽管文件已经删除,PID仍在运行是什么原因
lsof +L1 | awk '{print $2}' | sort | uniq
193699
Run Code Online (Sandbox Code Playgroud)
是否有可能避免这种情况?