Linux操作系统上lsof命令详解-使用 lsof 查找打开的文件的进程编号,fuser -v和fuser -m。lsof其它常规用法,及如何强制umount出现device is busy,查看是哪些程序占用。当-f强制不行,还得-l ,也就是lazy选项合用才行,再不行只有杀死对应的占用目录的进程。强制卸载。

jackxiang 2013-11-11 11:58 | |

linux umount 时出现device is busy 的处理方法--fuser,20253进程在使用,退出或杀死:
    * 查询: fuser -m /media/share  #/media/share 是挂载在本地的目录
    * fuser -m 找出其所有进程:fuser -m /dev/ttyACM0 | awk '{for(i=1;i<=NF;i++) if($i ~ /^[0-9]+$/) print "ps -p " $i}'|sh
    * 显示: /media/share: 25023c  #25023c   是进程编号,25023是进程PID。用ps aux|grep 25023进行查看是哪个进程导致出现device is busy

问:lsof -p 1498 | grep ttyACM0
没有输出任何内容,是它有可能打开过,可能并闭了是么,内核会记录下来,我只是查到当时打开过,是这个意思吗
答:是的,你的理解是正确的。即使进程已经打开了一个文件,但在某些情况下,它可能会在后来将其关闭。在这种情况下,`lsof`命令可能不会显示任何与该进程相关的文件描述符。内核确实会记录文件的打开和关闭事件,但是通常情况下,这些记录是暂时的,一般情况下不会保留太长时间。

如果你想要更详细地追踪设备的使用情况,你可能需要使用其他工具或技术,如系统日志(`/var/log/messages`或`/var/log/syslog`),来查看设备的活动历史记录。
—————————————————————某个文件是谁在读取,反查进程有用———————————————————————————————
umount /data/htdocs/xiyou.cntv.cn/application/views/themes/default/nettv/adp
/data/htdocs/xiyou.cntv.cn/application/views/themes/default/nettv/adp was not found in /proc/mounts 解决办法:
解决:
umount 时使用 -l 命令。
umount /img1/bbs/img1.bbs.cctv.com -f -l  #当-f强制不行,还得-l ,也就是lazy选项合用才行,再不行只有杀死对应的占用目录的进程。
sudo umount -l /data/htdocs/xiyou.cntv.cn/application/views/themes/default/nettv/adp
       -l     Lazy  unmount. Detach the filesystem from the filesystem hierarchy now, and cleanup all references to the filesystem as
              soon as it is not busy anymore.  (Requires kernel 2.4.11 or later.)
来自:https://blog.csdn.net/robertsong2004/article/details/41346629



[root@iZ25dcp92ckZ multepoolserver]# ps aux|grep hhvm
www      15801  0.0 14.0 826616 142904 ?       Sl   14:15   0:00 /usr/bin/hhvm --mode server --user www --config /etc/hhvm/server.ini --config /etc/hhvm/php.ini --config /etc/hhvm/config.hdf
www      15804  0.0  0.1 115212  1404 ?        S    14:15   0:00 bash -c ! fuser /data/runsock/hhvm.sock
www      15805  0.0  0.0 107904   828 ?        R    14:15   0:00 fuser /data/runsock/hhvm.sock
root     15807  0.0  0.0 110224   904 pts/0    S+   14:15   0:00 grep --color=auto hhvm
[root@iZ25dcp92ckZ multepoolserver]# fuser /data/runsock/hhvm.sock
/data/runsock/hhvm.sock: 15801
——————————————————————————————————————————————————————————————

我的日志文件太大了,一直在写,但关了还有程序在写,能反查到是谁在写么?
du -sh Remote-20131216.log  
4.3G    Remote-20131216.log
lsof abc.txt 显示开启文件abc.txt的进程:
lsof  Remote-20131216.log  .
安装lsof包(yum install lsof),安装完成可以使用lsof命令。
没有:
回忆未来-向东-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

来自:http://www.cnblogs.com/bangerlee/articles/2460614.html
         http://www.cnblogs.com/yuboyue/archive/2011/07/18/2109838.html
方法:

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)


整理来自:
http://www.ibm.com/developerworks/cn/aix/library/au-lsof.html




————————————————————linux如何使用umount命令强制卸载文件系统—————————————————————————
  umount命令
  解挂文件系统。umount [-ahnrvV][-t 《文件系统类型》][文件系统]
  umount可卸除目前挂在Linux目录中的文件系统。
  线上在用的nfs访问时出了问题,导致/data1目录ls都无法进行输出,需要进行卸载掉 。而直接卸载时由于目录正被其他进程占用 ,无法直接umount,这里就结合fuser进行umount卸载。
  1、直接卸载
  [root@localhost /]# umount /data1/img
  umount: /data1/img: device is busy
  umount: /data1/img: device is busy
  2、提示被占用,使用强制卸载
  [root@localhost /]# umount -f /data1/img
  umount2: Device or resource busy
  umount: /data1/img: device is busy
  umount2: Device or resource busy
  umount: /data1/img: device is busy
  注:使用-f 参数进行强制卸载时一般建议等一会儿再进行下面的操作,一些情况下处理需要1-2分钟的时间。
  3、使用umount -f,问题依旧。使用fuser命令,先确认有那些进程在占用该目录
  [root@localhost /]# fuser -cu /data1/img
  /data1/img: 1757c(mysql)
  上面查看发现是pid为1757的mysql用户起的进程在占用该目录。
  4、确认mysql所起的进程可以kill 后,可以直接使用fuser 的k参数进行kill (也可以手动停掉1757进程再卸载)
  [root@localhost /]# fuser -ck /data1/img
  /data1/img: 1757c
  注:这里k 就是kill的意思,注意没进行确认前要谨慎使用该参数。
  另外,umount异常时,也经常会用到 lsof 指定确认文件被什么进程占用
  上面就是Linux使用umount命令强制卸载文件系统的方法,即使提示被占用也照样能够通过命令来卸载。
来自:http://www.xitongzhijia.net/xtjc/20150610/50557.html


=============== linux umount 时出现device is busy 的处理方法--fuser======================
使用 fuser 的指令

那要怎麼找出是哪个程式挂在那个目录上?可以使用 fuser - identify processes using files or sockets

假设现在 mount 起来的目录是 /media/share

    * 查询: fuser -m /media/share
    * 显示: /media/share: 25023c

就代表是 process 25023(pid) 有使用到此目录, 后面 c 代表的意思可参考下述:

    * c: current directory.
    * e: executable being run.
    * f: open file. f is omitted in default display mode.
    * F: open file for writing. F is omitted in default display mode.
    * r: root directory.
    * m: mmap'ed file or shared library.

要把这个资源释放的话, 可以有下述做法:

    * kill -9 25023 # ps aux | grep 25023 应该就会看到它
    * fuser -m -v -i -k /media/share # 会问你是不是要把 25023 这个 kill 掉, 选 y 就会 kill 掉

          提示信息如下:
          USER      PID   ACCESS COMMAND
          /meida/share: root      25023 ..c..  bash
          Kill process 25023 ? (y/N) y
来自:http://blog.csdn.net/radkitty/article/details/5337304

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/6800/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2024-4-18 13:32
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]