lsof 与 fuser
lsof
lsof 是 list open files 的缩写,即它能够列出任何文件信息 (Unix/Linux 一切皆文件)。这篇文章介绍了很多 lsof 的用法。(链接备份)
ls 能按条件查找,比如查看用户相关的、或端口相关的、或进程相关的所有文件信息
Mac 的 lsof 缺陷
Mac 系统用 lsof 命令查任何文件,都会卡很久才出结果。
# 实测
> time lsof -n s.js
real 1m55.912s
user 0m0.215s
sys 1m50.129s
Why is lsof on OS X so ridiculously slow?
实测,答案里的这堆参数都加了也没有用。
fuser
fuser 能列出正在对某个文件或端口访问的所有进程。
如果你使用 Linux 系统,但找不到 fuser 这个命令,需要安装 psmisc 工具包。
psmisc: A package of small utilities that use the proc file-system. psmisc 提供以下命令,
- fuser - Identifies processes using files or sockets
- killall - kills processes by name, e.g. killall -HUP named
- prtstat - prints statistics of a process
- pslog - prints log path(s) of a process
- pstree - shows the currently running processes as a tree
- peekfd - shows the data travelling over a file descriptor
fuser 比 lsof 多出一个 -k
参数的功能,它是用来 kill 相关进程。
Mac 的 fuser 缺陷
Mac 系统也有装 fuser,但是这个 fuser 不支持 -k
参数。
而且 Mac 的 fuser 实际会调用 lsof,所以还是会卡很久。
例子,
ps -ef | grep 33447
501 33447 29390 0 7:25下午 ttys017 0:00.04 /usr/bin/perl -w /usr/bin/fuser README.md
501 33448 33447 0 7:25下午 ttys017 2:02.26 /usr/sbin/lsof -F pf -- README.md
找回被删除的文件
你甚至可以使用 lsof 来找到被删除的文件!(前提是有某个进程正在使用这个文件)
当 UNIX 计算机受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹。管理错误也可能导致意外删除重要的文件,比如在清理旧日志时,意外地删除了数据库的活动事务日志。有时可以恢复这些文件,并且 lsof 可以为您提供帮助。 当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录条目。 Linux 的优点在于,它保存了文件的名称,甚至可以告诉我们它已经被删除。在遭到破坏的系统中查找相关内容时,这是非常有用的内容,因为攻击者通常会删除日志以隐藏他们的踪迹。
umount 与 target is busy
有时候 umount 设备时会报错 target is busy
或者 device is busy
。
可以用 sudo lsof $path
或者 sudo fuser -mv $path
查看什么进程在使用这个文件。