lsof 与fuser

服务器上调试程序时,有时会遇到所需资源被占用的情况,这时就要查一下是什么程序占用了资源。需要用到lsof与fuser指令。

lsof用于显示打开文件的信息

lsof  filename 显示打开指定文件的所有进程
lsof -a 表示两个参数都必须满足时才显示结果
lsof -c string   显示COMMAND列中包含指定字符的进程所有打开的文件
lsof -u username  显示所属user进程打开的文件
lsof -g gid 显示归属gid的进程情况
lsof +d /DIR/ 显示目录下被进程打开的文件
lsof +D /DIR/ 同上,但是会搜索目录下的所有目录,时间相对较长l

例如

vigar@vigar-laptop:~/下载/nice$ lsof /opt/google/chrome/chrome
COMMAND  PID  USER  FD   TYPE DEVICE SIZE/OFF    NODE NAME
chrome  4913 vigar txt    REG    8,6 68449288 1835017 /opt/google/chrome/chrome
chrome  4917 vigar txt    REG    8,6 68449288 1835017 /opt/google/chrome/chrome
chrome  4919 vigar txt    REG    8,6 68449288 1835017 /opt/google/chrome/chrome

lsof查特定端口

hpcentos5-/opt/test/bin> lsof -itcp:5000
COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
perl    8587 admin    3u  IPv4 510003      0t0  TCP hpcentos5:commplex-main (LISTEN)

 

fuser 的作用与lsof非常相似,也会将使用指定文件的进程信息全部列出

vigar@vigar-laptop:~/下载/nice$ fuser -v /opt/google/chrome/chrome
                     用户     进程号 权限   命令
/opt/google/chrome/chrome:
                     vigar      4913 ...e. chrome
                     vigar      4917 ...e. chrome
                     vigar      4919 ...e. chrome

     权限含义:

   c 将此文件作为当前目录使用。 
      e 将此文件作为程序的可执行对象使用。 
      r 将此文件作为根目录使用。 
      s 将此文件作为共享库(或其他可装载对象)使用

 

   fuser另一个非常有用的功能是-k,可以杀死指定进程(发SIGKILL信号)  

vigar@vigar-laptop:~/下载/nice$ fuser aaa.avi
aaa.avi:             14097
vigar@vigar-laptop:~/下载/nice$ fuser -k aaa.avi
aaa.avi:             14097
vigar@vigar-laptop:~/下载/nice$ fuser aaa.avi
vigar@vigar-laptop:~/下载/nice$ 
可知占用aaa.avi的进程已经被干掉。当然,执行这条指令需要足够的权限,有root权限最好,其它人是无法杀死别人的进程的。

 当利用lsof或fuser查出指定进程号后,即可用netstat -anp | grep pid查出其开放端口

test> netstat -anp | grep 7172
(Not all processes could be identified, non-owned process info
tcp        0      0 :::8777                     :::*                        LISTEN      7172/java           
tcp        0      0 ::ffff:10.0.7.128:23564     ::ffff:10.0.3.103:1521      ESTABLISHED 7172/java           
tcp        0      0 ::ffff:10.0.7.128:23550     ::ffff:10.0.3.103:1521      ESTABLISHED 7172/java           
tcp        0      0 ::ffff:10.0.7.128:10629     ::ffff:10.0.3.91:1414       ESTABLISHED 7172/java           
tcp        0      0 ::ffff:10.0.7.128:23562     ::ffff:10.0.3.103:1521      ESTABLISHED 7172/java           
tcp        0      0 ::ffff:10.0.7.128:23572     ::ffff:10.0.3.103:1521      ESTABLISHED 7172/java           

 有时在机器上查出某个进程在跑,却不知道程序部署在何处,可以用ps -ef 查出pid,用lsof| grep pid,根据得到的信息推断出程序位置

 

posted @ 2012-11-18 23:10  vigarbuaa  阅读(2037)  评论(0编辑  收藏  举报