Linux命令学习手册-lsof
lsof [options] filename功能
列出进程打开的文件的信息。
形容
lsof 简介
lsof ( list open files )是一个列出当前系统打开文件的工具。
在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和客户数据报协议 (UDP) 套接字等,系统在后端都为该应用程序分配了一个文件形容符,无论这个文件的本质如何,该文件形容符为应用程序与基础操作系统之间的交互提供了通用接口。由于应用程序打开文件的形容符列表提供了大量关于这个应用程序本身的信息,因而通过 lsof 工具能够查看这个列表对系统监测以及排错将是很有帮助的。
lsof 使用
lsof 输出信息含义在终端下输入 lsof 就可显示系统打开的文件,由于 lsof 需要访问核心内存和各种文件,所以必需以 root 客户的身份运行它才能够充分地发挥其功能。
lsof 常见的用法
是查找应用程序打开的文件的名称和数目。可用于查找出某个特定应用程序将日志数据记录到何处,或者者正在跟踪某个问题。例如,linux限制了进程能够打开文件的数目。通常这个数值很大,所以不会产生问题,并且在需要时,应用程序可以请求更大的值(直到某个上限)。假如你怀疑应用程序耗尽了文件形容符,那么可以使用 lsof 统计打开的文件数目,以进行验证。
常用参数列表:
lsof -a表示两个参数都必需满足时才显示结果lsof -c string显示COMMAND列中包含指定字符的进程所有打开的文件lsof -u username显示所属user进程打开的文件lsof -g gid显示归属gid的进程情况lsof +d /DIR/显示目录下被进程打开的文件lsof +D /DIR/同上,但是会搜索目录下的所有目录,时间相对较长lsof -d FD显示指定文件形容符的进程lsof -n不将IP转换为hostname,缺省是不加上-n参数lsof -i用以显示符合条件的进程情况lsof -i[46] [protocol][@hostname|hostaddr][:service|port]参数如下:
46 --> IPv4 or IPv6 protocol --> TCP or UDP hostname --> Internet host name hostaddr --> IPv4地址 service --> /etc/service中的 service name (可以不只一个) port --> 端口号 (可以不只一个)
举例
显示打开 test_recover 文件的所有进程
#lsof test_recover COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME less 22464 quietheart 4r REG 8,8 87 1835435 test_recover显示当前所有打开的文件的状态
#lsof |head COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME init 1 root cwd DIR 8,8 4096 2 / init 1 root rtd DIR 8,8 4096 2 / init 1 root txt REG 8,8 38652 65667 /sbin/init init 1 root mem REG 8,8 129832 5199973 /lib/ld-2.5.so init 1 root mem REG 8,8 1689640 5199975 /lib/libc-2.5.so init 1 root mem REG 8,8 20668 5203232 /lib/libdl-2.5.so init 1 root mem REG 8,8 93508 5204012 /lib/libselinux.so.1 init 1 root mem REG 8,8 245376 5204011 /lib/libsepol.so.1 init 1 root 10u FIFO 0,17 1310 /dev/initctl这里,输出很多,所以只给出了前10行,每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。 lsof 输出各列信息的意义如下:
COMMAND:进程的名称PID:进程标识符USER:进程所有者FD:文件形容符,应用程序通过文件形容符识别该文件。如cwd、txt等TYPE:文件类型,如DIR、REG等DEVICE:指定磁盘的名称SIZE:文件的大小NODE:索引节点(文件在磁盘上的标识)NAME:打开文件确实切名称
其中 FD 列中的文件形容符 cwd 值表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改。 txt 类型的文件是程序代码,如应用程序二进制文件本身或者共享库,如上列表中显示的 /sbin/init 程序。其次数值表示应用程序的文件形容符,这是打开该文件时返回的一个整数。如上的最后一行文件 /dev/initctl ,其文件形容符为 10。 u 表示该文件被打开并处于读取/写入模式,而不是只读 ? 或者只写 ( w ) 模式。同时还有大写 的 W 表示该应用程序具备对整个文件的写锁。该文件形容符用于确保每次只能打开一个应用程序实例。初始打开每个应用程序时,都具备三个文件形容符,从 0 到 2 ,分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的 FD 都是从 3 开始。 与 FD 列相比, Type 列则比较直观。文件和目录分别称为 REG 和 DIR 。而 CHR 和 BLK ,分别表示字符和块设施;或者者 UNIX 、 FIFO 和 IPv4 ,分别表示 UNIX 域套接字、先进先出 ( FIFO ) 队列和网际协议 ( IP ) 套接字。
显示 COMMAND 列包含 vim 字符串的进程打开的所有文件
# lsof -c vim |head COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME vim 3316 quietheart cwd DIR 8,5 16384 329 /mnt/d/myOwn_all/tmp/command_stud vim 3316 quietheart rtd DIR 8,8 4096 2 / vim 3316 quietheart txt REG 8,8 2731692 6070016 /usr/bin/vim vim 3316 quietheart mem REG 8,8 129832 5199973 /lib/ld-2.5.so vim 3316 quietheart mem REG 8,8 1689640 5199975 /lib/libc-2.5.so vim 3316 quietheart mem REG 8,8 216544 5203230 /lib/libm-2.5.so vim 3316 quietheart mem REG 8,8 20668 5203232 /lib/libdl-2.5.so vim 3316 quietheart mem REG 8,8 137908 5203217 /lib/libpthread-2.5.so vim 3316 quietheart mem REG 8,8 25624 5204024 /lib/libacl.so.1.1.0这里,输出太多了,所以用 head 来只查看前10行。
查看所属 quietheart 的进程打开的所有文件
# lsof -u quietheart |head COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME gnome-ses 2686 quietheart cwd DIR 8,8 4096 8601211 /home/quietheart gnome-ses 2686 quietheart rtd DIR 8,8 4096 2 / gnome-ses 2686 quietheart txt REG 8,8 129356 6082349 /usr/bin/gnome-session gnome-ses 2686 quietheart mem REG 8,8 95728 6065856 /usr/lib/libICE.so.6.3.0 gnome-ses 2686 quietheart mem REG 8,8 35012 6065858 /usr/lib/libSM.so.6.0.0 gnome-ses 2686 quietheart mem REG 8,8 30488 6064168 /usr/lib/libpopt.so.0.0.0 gnome-ses 2686 quietheart mem REG 8,8 80636 5204010 /lib/libresolv-2.5.so gnome-ses 2686 quietheart mem REG 8,8 7748 5204013 /lib/libcom_err.so.2.1 gnome-ses 2686 quietheart mem REG 8,8 7880 5204009 /lib/libkeyutils-1.2.so这里,输出太多了,所以用 head 来只显示前10行。
显示 /home/quietheart 目录下被打开的文件
# lsof +d /home/quietheart |head COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME gdm-binar 2631 root 8w REG 8,8 1829 8602026 /home/quietheart/.xsession-errors gnome-ses 2686 quietheart cwd DIR 8,8 4096 8601211 /home/quietheart gnome-key 2762 quietheart cwd DIR 8,8 4096 8601211 /home/quietheart metacity 2784 quietheart cwd DIR 8,8 4096 8601211 /home/quietheart gnome-pan 2790 quietheart cwd DIR 8,8 4096 8601211 /home/quietheart nautilus 2792 quietheart cwd DIR 8,8 4096 8601211 /home/quietheart eggcups 2800 quietheart cwd DIR 8,8 4096 8601211 /home/quietheart bt-applet 2811 quietheart cwd DIR 8,8 4096 8601211 /home/quietheart nm-applet 2831 quietheart cwd DIR 8,8 4096 8601211 /home/quietheart这里,经过实践发现,这个 +d 选项没有的话,似乎就不列出当前路径下被打印的文件了。个人感觉这个选项就是非递归列出当前目录所打开的文件,假如想要递归,需要使用 +D 选项。
查看 22 端口现在运行的情况
#lsof -i :22 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME sshd 2314 root 3u IPv6 9648 TCP *:ssh (LISTEN)查看所属 quietheart 客户进程打开的文件类型为 txt 的文件
# lsof -a -u quietheart -d txt |head COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME gnome-ses 2686 quietheart txt REG 8,8 129356 6082349 /usr/bin/gnome-session ssh-agent 2720 quietheart txt REG 8,8 88996 6074483 /usr/bin/ssh-agent dbus-laun 2750 quietheart txt REG 8,8 23796 6067805 /usr/bin/dbus-launch dbus-daem 2752 quietheart txt REG 8,8 326032 4938408 /bin/dbus-daemon gconfd-2 2759 quietheart txt REG 8,8 60564 6082433 /usr/libexec/gconfd-2 gnome-key 2762 quietheart txt REG 8,8 97396 6076656 /usr/bin/gnome-keyring-daemon gnome-set 2764 quietheart txt REG 8,8 178556 6076857 /usr/libexec/gnome-settings-daemon metacity 2784 quietheart txt REG 8,8 521080 6076579 /usr/bin/metacity scim-laun 2787 quietheart txt REG 8,8 19720 3957200 /usr/lib/scim-1.0/scim-launcher这里,输出太多了,所以使用 head 只显示前10行。
[其它]
查看占用文件的进程
一个比较使用的应用就是可以利用 lsof 恢复被删除的文件,或者者看某个文件系统被哪个进程占用,导致无法卸载。
卸载之前,查看使用 ./sourceforge/quietheart/branches/temp/ 目录下以及子目录下所有文件的进程
# lsof +D ./sourceforge/quietheart/branches/temp/ COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME bash 17169 quietheart cwd DIR 8,8 4096 2986295 ./sourceforge/quietheart/branches/temp/ vim 17203 quietheart cwd DIR 8,8 4096 2986153 ./sourceforge/quietheart/branches/temp/driverDemo/my_mapmem vim 17203 quietheart 4u REG 8,8 12288 2986159 ./sourceforge/quietheart/branches/temp/driverDemo/my_mapmem/.mapmem.c.swp vim 17203 quietheart 5u REG 8,8 12288 2125763 ./sourceforge/quietheart/branches/temp/.readme.swp在这个示例中,客户 quietheart 正在目录 temp 中进行少量操作。一个 bash 实例正在运行,并且它当前的目录为 temp ,另一个则显示的是 vim 正在编辑其下的某个文件。假设这个目录挂载在一个文件系统上面,要成功地卸载这个目录,应该在通知客户以确保情况正常之后,停止这些进程。
这个示例说明了:应用程序的当前工作目录非常重要,由于它仍保持着文件资源,并且可以防止文件系统被卸载。这就是为什么大部分守护进程(后端进程)将它们的目录更改为根目录、或者服务特定的目录(如 sendmail 示例中的 /var/spool/mqueue )的起因,以避免该守护进程阻止卸载不相关的文件系统。
恢复被删除的文件
当Linux计算机受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹。管理错误也可能导致意外删除重要的文件,比方在清除旧日志时,意外地删除了数据库的活动事务日志。有时可以通过 lsof 来恢复这些文件。
原理是:
当进程打开了某个文件时,只需该进程保持打开该文件,即便将其删除,它仍然存在于磁盘中。当文件删除时,进程并不知道文件已经被删除,它依然可以向打开该文件时提供给它的文件形容符进行读取和写入。除了该进程之外,这个文件是不可见的,由于已经删除了其相应的目录索引节点。 在/proc 目录下,其中包含了反映内核和进程树的各种文件。/proc目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因而当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。大多数与 lsof 相关的信息都存储于以进程的 PID 命名的目录中,即 /proc/1234 中包含的是 PID 为 1234 的进程的信息。每个进程目录中存在着各种文件,它们可以使得应用程序简单地理解进程的内存空间、文件形容符列表、指向磁盘上的文件的符号链接和其余系统信息。lsof 程序使用该信息和其余关于内核内部状态的信息来产生其输出。所以lsof 可以显示进程的文件形容符和相关的文件名等信息。也就是我们通过访问进程的文件形容符可以找到该文件的相关信息。当系统中的某个文件被意外地删除了,只需这个时候系统中还有进程正在访问该文件,那么我们即可以通过 lsof 从 /proc 目录下恢复该文件的内容。
例如我们要恢复一个被删除的文件 test_recover ,如下:
查看当前文件
[quietheart@lv-k lsof_test]$ ls test_recover test_recover2 [quietheart@lv-k fd]$less test_recover goodfile it is very good!! it is used to test how to recover a deleted file with lsof.这时候,文件还处于没有删除的状态,在这个状态下,我们使用 less 打开了文件,并把 less 置于后端。
删除文件 test_recover
[quietheart@lv-k lsof_test]$rm test_recover [quietheart@lv-k lsof_test]$ ls test_recover2这样,我们已经将文件删除,但是因为 less 还在运行,所以这个文件尽管我们看不见了,但是 less 不知道它删除了, less 还是可以对文件进行读写的,也就是说这个文件的数据实际还存在于磁盘上。
查看删除的文件的信息
[quietheart@lv-k lsof_test]$lsof |grep test_recover less 22197 quietheart 4r REG 8,8 87 1837925 /home/quietheart/test/lsof_test/test_recover (deleted)这里,通过 lsof 我们可以看到被删除的文件的信息。
根据删除文件的信息恢复删除的文件
[quietheart@lv-k lsof_test]$cd /proc/22197/fd [quietheart@lv-k fd]$ ls 0 1 2 3 4 [quietheart@lv-k fd]$cat 4 goodfile it is very good!! it is used to test how to recover a deleted file with lsof. [quietheart@lv-k fd]$ cat 4 >/home/quietheart/test/lsof_test/test_recover [quietheart@lv-k fd]$ cd /home/quietheart/test/lsof_test/ [quietheart@lv-k lsof_test]$ ls test_recover test_recover2 [quietheart@lv-k lsof_test]$ cat test_recover goodfile it is very good!! it is used to test how to recover a deleted file with lsof.根据前面 lsof 的信息可知,被删除的文件实际就是 less 程序的文件形容符号 4 ,根据此我们确定了要恢复的文件。使用 cat 对文件进行恢复。
对于许多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有用
参考资料
- http://bbs.chinabyte.com/thread-382064-1-1.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Linux命令学习手册-lsof