分类: LINUX
2008-11-26 13:18:47
你是否在删除文件或卸载装置时遇到过一些问题,即便你以root用户操作也解决不了?很有可能是因为设备挂载处的文件或文件夹正在被另一个用户或程序使用中。本期的心得技巧告诉你如何查找哪个用户或程序正在使用你要删除的文件或文件夹。
首先安装lsof工具:
代码 4.1: 安装lsof |
# emerge lsof |
lsof会列举出系统使用中的文件。一个使用中的文件可以是你正在使用其它程序编辑、阅读中的一个文件,也可以是你正在浏览的一个文件夹。下面举例说明如何在卸载设备时出现拒绝卸载的问题中使用lsof工具。比如拉里牛想把几天前装载的一个CD-ROM卸载了,当他试着操作时,得到了如下的错误信息:
代码 4.2: 卸载一张CD |
# umount /mnt/cdromumount: /mnt/cdrom: device is busyumount: /mnt/cdrom: device is busy |
/mnt/cdrom正被使用中。由于拉里不记得是什么程序正在使用光驱,他运行了lsof,并得到如下提示:
代码 4.3: 使用lsof |
# lsof | grep /mnt/cdrombash 6453 larry cwd DIR 7,0 2048 1856 /mnt/cdromsu 15774 root cwd DIR 7,0 2048 1856 /mnt/cdrom |
前两个字段标注的是进程名称和进程ID,第三个字段是进行的所有者,第四个是文件描述信息,之后的字段分别为文件类型、设备号、文件大小、节点号码,最后是文件名。文件描述信息也即文件类型,在这个实例中此处是cwd,或者当前工作目录。这表明用户larry在某处把自己的shell目录指向了/mnt/cdrom。由于拉里打开了很多shell程序,他决定缩小范围以查找可能占用设备的shell程序:
代码 4.4: 检查shell |
# lsof -R | grep /mnt/tempbash 6453 6437 larry cwd DIR 7,0 2048 1856 /mnt/cdromsu 15774 6453 root cwd DIR 7,0 2048 1856 /mnt/cdrom |
此时多出现了一个字段,显示出了bash和su的父进程。正如你所看到的,su是bash的子进程。这可能意味着拉里在使/mnt/cdrom一直处于忙碌状态的那个bash会话中运行了su。接下来,拉里查找到bash的父进程:
代码 4.5: 查找父进程 |
# ps aux | grep 6437larry 6437 0.0 0.7 38880 24628 ? S Aug09 9:00 konsole [kdeinit] -session 10be696 |
拉里使用Konsole做为他的终端程序。因此他知道必须在Konsole的其中一个窗口中寻找相应的bash会话。拉里运行pstree已找到可能的Konsole窗口:
代码 4.6: 查找Konsole |
# pstree 6437konsole-+-bash---python---{python} |-2*[bash] |-bash---su---bash---pstree |-2*[bash---su---bash] |-bash---su---bash---vi |-bash---ssh `-bash---su---bash---man---sh---sh---less |
利用这些信息,拉里进一步缩小自己的推测范围,定位于第四个bash会话,该会话中运行了su。为使/mnt/cdrom不再处于忙碌状态,他退出了su终端并使用cd命令退出了/mnt/cdrom目录。
lsof也可用于其他用途。例如,你可以用它来监控网络连接:
代码 4.7: 监控网络连接 |
# lsof -i TCP:22COMMAND PID USER FD TYPE DEVICE SIZE NODE NAMEsshd 6094 root 3u IPv4 9145 TCP *:ssh (LISTEN)ssh 9962 andrey 3u IPv4 3489405 TCP larry.cow:35467>larry.bull:ssh (ESTABLISHED) |
此处我们看到了监听ssh连接的sshd服务和一个向外连接的ssh会话。
lsof工具的/usr/share/lsof/scripts/文件夹下还有一些脚本。大部分脚本在如何更好地监视系统用户方面会对你有所帮助。