Chinaunix首页 | 论坛 | 博客
  • 博客访问: 557805
  • 博文数量: 166
  • 博客积分: 4038
  • 博客等级: 上校
  • 技术积分: 1115
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-14 23:29
文章分类

全部博文(166)

文章存档

2010年(12)

2009年(126)

2008年(28)

分类: 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

此时多出现了一个字段,显示出了bashsu的父进程。正如你所看到的,subash的子进程。这可能意味着拉里在使/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/文件夹下还有一些脚本。大部分脚本在如何更好地监视系统用户方面会对你有所帮助。

阅读(1969) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~