15

fuser命令让我知道哪些进程正在使用文件或目录。

我正在寻找相反的命令:让我知道进程正在使用哪些文件。


更新

忘了说它是针对 Solaris 系统的。

4

6 回答 6

42
lsof -p <pid>

这里

lsof 代表“<strong>列出打开的文件”。这个 shell 命令看起来很简单:它列出了 UNIX 机器上的进程打开的文件的信息。

尽管 lsof (表面上的)使命宣言不大,但它实际上是最强大和最有用的 UNIX 命令之一。它的原始力量来自 UNIX 的设计原则之一,通常被描述为“在 UNIX 中一切都是文件”。这意味着打开文件的 lsof 概念不仅涵盖常规文件,还包括以下内容:

  • 目录
  • 流或网络文件(例如,Internet 或 UNIX 域套接字和 NFS 文件)
  • 本机库(例如,链接到进程的 .soor .dylibdynamic 库)
  • 块和字符特殊文件(例如,磁盘卷、外部硬盘驱动器、控制台或鼠标)
  • 管道

等等,我在我的系统上找不到 lsof!

lsof 是一个非常受欢迎的工具,它已被移植到几乎所有的 UNIX 方言(Linux、Mac OS X、BSD、Solaris 等)中。如果它在您的盒子上不可用,请使用您通常的包管理系统来安装它。您可以在Sun Freeware上找到适用于 Solaris 的 lsof 软件包。

于 2008-11-19T07:38:27.883 回答
13

虽然我不会嫉妒任何学习 Dtrace 或获得安装软件经验的人,但在 Solaris 中有一个命令可以查看进程打开的文件:/usr/bin/pfiles

% tail -f /etc/motd &
[1] 6033

% pfiles 6033
6033:   tail -f /etc/motd

      Current rlimit: 256 file descriptors
       0: S_IFREG mode:0644 dev:182,65538 ino:163065 uid:0 gid:3 size:54
          O_RDONLY|O_LARGEFILE
          /etc/motd
       1: S_IFCHR mode:0620 dev:299,0 ino:718837882 uid:101 gid:7 rdev:24,3
          O_RDWR|O_NOCTTY|O_LARGEFILE
          /dev/pts/3
       2: S_IFCHR mode:0620 dev:299,0 ino:718837882 uid:101 gid:7 rdev:24,3
          O_RDWR|O_NOCTTY|O_LARGEFILE
          /dev/pts/3
于 2008-12-24T18:02:11.867 回答
2
  1. 您可以使用ls命令和grep找出 chrome 使用的文件

$ ls -l /proc/*/fd | grep“铬”

lrwx------ 1 ba abc 64 Jul 16 22:19 104 -> /home/abc/.config/google-chrome/Default/Cookies

lr-x------ 1 abc abc 64 Jul 16 22:19 113 -> /opt/google/chrome/nacl_irt_x86_64.nexe

lrwx------ 1 abc abc 64 Jul 16 22:19 121 -> /home/abc/.cache/google-chrome/Default/Cache/data_0

lrwx------ 1 abc abc 64 Jul 16 22:19 122 -> /home/abc/.cache/google-chrome/Default/Cache/data_1

lrwx------ 1 abc abc 64 Jul 16 22:19 123 -> /home/abc/.cache/google-chrome/Default/Cache/data_2

lr-x------ 1 abc abc 64 Jul 16 22:19 125 -> /home/abc/.config/google-chrome/Dictionaries/en-US-3-0.bdic

使用lsofgrep查找结果的另一个命令

$ lsof | grep“铬”

铬 2204 abc cwd DIR 8,5 4096 1441794 /home/abc

铬 2204 abc rtd DIR 8,5 4096 2 /

铬 2204 abc txt REG 8,5 87345336 5111885 /opt/google/chrome/chrome

chrome 2204 abc mem REG 8,5 4202496 1443927 /home/abc/.cache/google-chrome/Default/Media Cache/data_3

chrome 2204 abc mem REG 8,5 1056768 1443926 /home/abc/.cache/google-chrome/Default/Media Cache/data_2

chrome 2204 abc mem REG 8,5 270336 1443925 /home/abc/.cache/google-chrome/Default/Media Cache/data_1

chrome 2204 abc mem REG 8,5 45056 1443924 /home/abc/.cache/google-chrome/Default/Media Cache/data_0

于 2014-07-16T19:40:47.637 回答
1

您可以从http://www.sunfreeware.com/programlistsparc10.html#lsof获取 lsof

您也可以尝试 pfile:

http://docs.oracle.com/cd/E23823_01/html/816-5165/pfiles-1.html#scrolltoc

于 2008-11-19T07:55:37.507 回答
1

这是dtrace的经典应用程序。

我不记得确切的语法,但是每次系统上的任何进程打开文件时,您都可以触发跟踪。它可以在一个正在运行的系统上完成,而不会像我预期的那样有任何开销。如果您以管理员身份运行 solaris,dtrace 是您最好的朋友。即使你不是程序员,它也非常简单易学,是一个非常强大的系统查询工具。

于 2008-11-19T08:03:01.187 回答
1

在某些 unix 系统下,(IE:Linux),一个进程打开的所有文件都有一个 FD id。

这些可以在下面看到

/proc/$PID/fd

ls -la /proc/2055/fd 
total 0
dr-x------ 2 kent kent  0 Nov 19 21:44 .
dr-xr-xr-x 7 kent kent  0 Nov 19 21:42 ..
lr-x------ 1 kent kent 64 Nov 19 21:44 0 -> /dev/null
l-wx------ 1 kent kent 64 Nov 19 21:44 1 -> /home/kent/.xsession-errors
lrwx------ 1 kent kent 64 Nov 19 21:44 10 -> socket:[3977613]
lrwx------ 1 kent kent 64 Nov 19 21:44 11 -> /home/kent/.googleearth/Cache/dbCache.dat
lrwx------ 1 kent kent 64 Nov 19 21:44 12 -> /home/kent/.googleearth/Cache/dbCache.dat.index
lrwx------ 1 kent kent 64 Nov 19 21:44 13 -> socket:[3978765]
lrwx------ 1 kent kent 64 Nov 19 21:44 14 -> socket:[3978763]
lrwx------ 1 kent kent 64 Nov 19 21:44 15 -> socket:[3978766]
lrwx------ 1 kent kent 64 Nov 19 21:44 17 -> socket:[3978764]
l-wx------ 1 kent kent 64 Nov 19 21:44 2 -> /home/kent/.xsession-errors
lr-x------ 1 kent kent 64 Nov 19 21:44 3 -> pipe:[3977583]
l-wx------ 1 kent kent 64 Nov 19 21:44 4 -> pipe:[3977583]
lr-x------ 1 kent kent 64 Nov 19 21:44 5 -> pipe:[3977584]
l-wx------ 1 kent kent 64 Nov 19 21:44 6 -> pipe:[3977584]
lr-x------ 1 kent kent 64 Nov 19 21:44 7 -> pipe:[3977587]
l-wx------ 1 kent kent 64 Nov 19 21:44 8 -> pipe:[3977587]
lrwx------ 1 kent kent 64 Nov 19 21:44 9 -> socket:[3977588]

此外,有时您甚至会得到“FDINFO”(我认为这是 linux 上的内核标志)

cat /proc/2055/fdinfo/11 
pos:    232741818
flags:  02
于 2008-11-19T08:47:02.753 回答