Unix进程正在使用的文件

15

fuser 命令可以告诉我哪些进程正在使用一个文件或目录。

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


更新

忘记提到这是针对 Solaris 系统的。


根据我的 manpage,lsof 可在 Solaris 9 和 10 上运行。 - Johannes Schaub - litb
6个回答

43
lsof -p <pid>

这里开始

lsof代表“列出打开的文件”。 这个shell命令看起来非常简单:它列出了UNIX系统上由进程打开的文件的信息。

尽管其(明显)谦虚的任务陈述,但lsof实际上是最强大和有用的UNIX命令之一。其强大功能来自于UNIX的设计原则之一,通常被描述为“在UNIX系统中,一切都是文件”。这意味着lsof对打开文件的概念不仅涵盖常规文件,还包括以下内容:

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

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

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


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

2
你可以使用ls命令和grep查找chrome使用的文件。 $ ls -l /proc/*/fd | grep "chrome" 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 "chrome" chrome 2204 abc cwd DIR 8,5 4096 1441794 /home/abc
chrome 2204 abc rtd DIR 8,5 4096 2 /
chrome 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

1

有趣,但是你怎么使用pfiles?pfiles pid会提示权限被拒绝... - VonC
针对特定进程,ls -l /proc/${pid}/fd/ | wc -l 命令是否会返回打开文件的数量? - user3104542

1

这是一个经典的应用程序,需要使用dtrace

我无法准确地记住语法,但是您可以让跟踪器在系统上任何进程打开文件时触发。它可以在运行中的系统上执行,而且开销远低于我的预期。如果您作为管理员在运行Solaris,则dtrace是您最好的朋友。即使您不是程序员,学习它也相当简单,并且是一个非常强大的系统查询工具。


我无法测试它:在我的Solaris服务器上似乎没有安装。如果您能提供一个示例,那会很有帮助。 - VonC

1
在一些UNIX系统(例如:Linux)中,进程打开的所有文件都有一个FD标识。你可以在以下目录中查看:
/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

1
鉴于原帖明确指出这是一个Solaris系统,因此此回答并没有太大的价值。 - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接