最新消息:

Linux操作系统上Lsof命令详解-使用 lsof 查找打开的文件的进程编号,fuser -v。lsof其它常规用法

fuser admin 4382浏览 0评论

我的日志文件太大了,一直在写,但关了还有程序在写,能反查到是谁在写么?
du -sh Remote-20131216.log
4.3G    Remote-20131216.log
lsof abc.txt 显示开启文件abc.txt的进程:
lsof  Remote-20131216.log
没有:
回忆未来-向东-Jàck  下午 03:41:05
我就是要这个啊哈哈。
没有囁。
大侠江  下午 03:42:36
COMMAND 有没有进程记录
如过没有就没有了
回忆未来-向东-Jàck  下午 03:44:20
我这边是加载的NFS,Linux都挂载到日志上了。
可能是这个原因吧?NFS网络挂载的。
linux中TOP命令显示出COMMAND进程名?
top 后有一个
http://www.ibm.com/developerworks/cn/aix/library/au-lsof.html
大侠江  下午 03:48:40
lsof 显示的的COMMAND
回忆未来-向东-Jàck  下午 03:49:51
好几列啊,就lsof  lsof |grep xxxx.avi 虽然有点慢,但是可以用。
lsof -f 不行的,先用grep试试吧。那就去掉-f,直接+文件试一试?
不行的。还是 grep 吧  lsof 加上-n貌似会快一点。
确实快了很多,瞬间返回。

这个lsof是啥原理,是扫整个系统的打开文件句柄了?
遍历 /proc/实现的。

fuser
fuser -v file
使用-v选项将显示更全的信息:
# fuser -v /root
USER     PID    ACCESS   COMMAND
/root:      root    17923    ..c..      bash
root    24869    ..c..      atop

root@119.10.*.23:~# fuser -v -n tcp 80
用户     进程号 权限   命令
80/tcp:              root       7717 F…. nginx
www        7718 F…. nginx
www        7719 F…. nginx

方法:

  1. lsof  Remote-20131216.log
  2. fuser -v Remote-20131216.log

lsof-4.82-4.el6.x86_64
[root@localhost htdocs]# rpm -qa|grep lsof
lsof-4.82-4.el6.x86_64

/usr/sbin/lsof|grep “Remote-20131216.log”

Linux操作系统上Lsof命令详解

一般root用户才能执行lsof命令,普通用户可以看见/usr/sbin/lsof命令,
但是普通用户执行会显示“permission denied”

我总结一下lsof指令的用法:
lsof abc.txt 显示开启文件abc.txt的进程
lsof -i :22 知道22端口现在运行什么程序
lsof -c abc 显示abc进程现在打开的文件
lsof -g gid 显示归属gid的进程情况

lsof +d /usr/local/ 显示目录下被进程开启的文件
lsof +D /usr/local/ 同上,但是会搜索目录下的目录,时间较长
lsof -d 4 显示使用fd为4的进程  www.2cto.com
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 –> 端口号 (可以不只一个)

例子: TCP:25 – TCP and port 25
@1.2.3.4 – Internet IPv4 host address 1.2.3.4
tcp@ohaha.ks.edu.tw:ftp – TCP protocol hosthaha.ks.edu.tw service name:ftp
lsof -n 不将IP转换为hostname,缺省是不加上-n参数

例子: lsof -i tcp@ohaha.ks.edu.tw:ftp -n
lsof -p 12 看进程号为12的进程打开了哪些文件
lsof +|-r [t] 控制lsof不断重复执行,缺省是15s刷新
-r,lsof会永远不断的执行,直到收到中断信号
+r,lsof会一直执行,直到没有档案被显示

例子:不断查看目前ftp连接的情况:lsof -i tcp@ohaha.ks.edu.tw:ftp -r
lsof -s 列出打开文件的大小,如果没有大小,则留下空白
lsof -u username 以UID,列出打开的文件

_________________________lsof其它常规用法_____________________________
一、带有 PID 筛选器并进行 txt 文件描述符筛选的 lsof 输出:
lsof -a -p 605 -d ^txt
实践:
[root@test http_pcap_codes]# ps aux|grep xiyouHttpInterfaceAnalyse
root     19147  0.0  5.3 451040 441392 ?       S    00:00   0:06 /data/htdocs/tools.xiyou.cntv.cn/http_pcap_codes/xiyouHttpInterfaceAnalyse

[root@test http_pcap_codes]# lsof -a -p 19147
COMMAND     PID USER   FD   TYPE DEVICE    SIZE                 NODE NAME
xiyouHttp 19147 root  cwd    DIR    8,3    4096             30507009 /root
xiyouHttp 19147 root  rtd    DIR    8,3    4096                    2 /
xiyouHttp 19147 root  txt    REG    8,3   18644             24117326 /data/htdocs/tools.xiyou.cntv.cn/http_pcap_codes/xiyouHttpInterfaceAnalyse
xiyouHttp 19147 root  mem    REG    8,3  139416             10125622 /lib64/ld-2.5.so
xiyouHttp 19147 root  mem    REG    8,3 1717800             10125623 /lib64/libc-2.5.so
xiyouHttp 19147 root  mem    REG    8,3  583798             19300366 /usr/local/lib/libpcap.so.1.4.0

二、要求 lsof 显示关于某个文件的信息:
lsof /var/run/sendmail.pid
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
sendmail 605 root    8wW VREG  281,3       32 8778600 /var/run/sendmail.pid
正如输出所示,进程 sendmail(PID 为 605)控制了文件 /var/run/sendmail.pid,并且通过排它锁打开该文件以便进行写入。如果出于某种原因,您需要删除这个文件,那么正确的做法是中止该进程,而不是直接删除这个文件。否则,这个守护进程下次可能无法正常启动,或者可能稍后会启动另一个实例,从而导致争用。

三、在 Linux 中使用 lsof 查找删除的文件:
lsof | grep error_log
[root@test ~]# lsof | grep error_log
cupsd      3328        root    3u      REG                8,3       3783              9273362 /var/log/cups/error_log.1

[root@test http_pcap_codes]# tail -f  /var/log/cups/error_log.1
………………
I [23/Apr/2013:14:03:46 +0800] Listening to 127.0.0.1:631 on fd 4…
………………

四、查找监听端口 631 的进程:
[root@test ~]# lsof -i :631
COMMAND  PID USER   FD   TYPE DEVICE SIZE NODE NAME
cupsd   3328 root    4u  IPv4  11681       TCP localhost.localdomain:ipp (LISTEN)
cupsd   3328 root    6u  IPv4  11684       UDP *:ipp

示例1:
[root@test http_pcap_codes]# netstat -atlunp|grep 631
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      3328/cupsd
udp        0      0 0.0.0.0:631                 0.0.0.0:*                               3328/cupsd

示例2:
假如我不知道这个9000端口是php-fpm,查找:
lsof -i :9000
[root@test ~]# lsof -i :9000
COMMAND   PID USER   FD   TYPE     DEVICE SIZE NODE NAME
php-fpm 24648 root    6u  IPv4 2654037777       TCP localhost.localdomain:cslistener (LISTEN)

五、使用 lsof 找出谁在使用文件系统:
lsof /export/home

搜索活动的连接:
lsof -i @192.168.109.8
[root@test ~]# lsof -i @192.168.109.8
COMMAND   PID        USER   FD   TYPE     DEVICE SIZE NODE NAME
php      3927         www    3u  IPv4  268885282       TCP 192.168.109.8:33040->192.168.109.7:14000 (ESTABLISHED)
php      3927         www    4u  IPv4  406835521       TCP 192.168.109.8:52239->192.168.109.7:21213 (ESTABLISHED)
php      3930         www    3u  IPv4 2644728406       TCP 192.168.109.8:gnutella-rtr->192.168.109.7:14000 (ESTABLISHED)
php      5519         www    3u  IPv4  406852603       TCP 192.168.109.8:45756->192.168.109.7:21213 (ESTABLISHED)

转载请注明:爱开源 » Linux操作系统上Lsof命令详解-使用 lsof 查找打开的文件的进程编号,fuser -v。lsof其它常规用法

您必须 登录 才能发表评论!