FD 列中的大写 W 表示该应用程式具备对整个文档的写锁。该文档用于确保每次只能打开一个应用程式实例。
查找打开某个文档的应用程式
在其他情况下,您有一个文档或目录,并且需要知道哪个应用程式控制了该文档(打开了该文档)。清单 2 显示了由 sendmail 进程打开了 /var/run/sendmail.pid。假如您不知道这个信息,那么在给定文档名的情况下,lsof 能够提供该信息。清单 3 显示了相应的输出。
清单 3. 需要 lsof 显示关于某个文档的信息
bash-3.00# 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,并且通过排他锁打开该文档以便进行写入。假如出于某种原因,您需要删除这个文档,那么正确的做法是中止该进程,而不是直接删除这个文档。否则,这个守护进程下次可能无法正常启动,或可能稍后会启动另一个实例,从而导致争用。
有时您只知道在文档系统的某处打开了文档。在卸载文档系统时,假如该文档系统中有任何打开的文档,那么操作将会失败。通过指定装入点的名称,您能够使用 lsof 显示一个文档系统中任何打开的文档。清单 4 显示了如何尝试卸载 /export/home,然后使用 lsof 找出谁在使用该文档系统。
清单 4. 使用 lsof 找出谁在使用文档系统
bash-3.00# umount /export/home
umount: /export/home busy
bash-3.00# lsof /export/home
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1943 root cwd VDIR 136,7 1024 4 /export/home/sean
bash 2970 sean cwd VDIR 136,7 1024 4 /export/home/sean
ct 3030 sean cwd VDIR 136,7 1024 4 /export/home/sean
ct 3030 sean 1w VREG 136,7 0 25 /export/home/sean/output
|
在这个示例中,用户 sean 正在其 home 目录中进行一些操作。有两个 bash(一种 Shell)实例正在运行,并且当前目录配置为 sean 的 home 目录。更有一个名为 ct 的应用程式正运行于相同的目录,并且其标准输出(文档描述符 1)重定向到一个名为 output 的文档。要成功地卸载 /export/home,应该在通知用户以确保情况正常之后,中止这些进程。
这个示例说明了应用程式的当前工作目录很重要,因为他仍保持着文档资源,并且能够防止文档系统被卸载。这就是为什么大部分守护进程(后台进程)将他们的目录更改为根目录、或服务特定的目录(如 sendmail 示例中的 /var/spool/mqueue)的原因,以避免该守护进程阻止卸载不相关的文档系统。假如 sendmail 从 /export/home/sean 目录启动,并且没有将其目录更改为 /var/spool/mqueue,那么在卸载 /export/home 前必须中止他。
假如您对非装入点目录中打开的文档感兴趣,那么必须通过 d 或 D 指定该目录的名称,具体使用其中的哪一个标志取决于您需要递归到子目录( D)或无需递归到子目录( d)。例如,要查看 /export/home/sean 中任何打开的文档,能够使用 lsof D /export/home/sean。在前面的示例中,相关的目录是个装入点,而这里和前面的示例存在细微的差别,并且限制了 lsof 和内核之间的交互。这还会引起潜在的问题,即 lsof /export/home 和 lsof /export/home/(请注意尾部的斜杠)有所区别。第一种方式能够正常工作,因为他指向了装入点。第二种方式不会生成任何输出,因为他指向了目录。假如您在 Shell 中使用 Tab 键自动完成命令,那么可能碰到这个问题,其中会帮助您添加结尾的斜杠。在这种情况下,您能够删除这个斜杠或使用 D 指定目录。前者是最好选择的方法,因为和指定任意的目录相比,其执行速度更快。
不常见的用法
在前面的部分中,我们研究了 lsof 的基本用法,即显示打开的文档和控制他们的进程之间的关系。当您想对系统进行一些烦琐的操作,而又不希望破坏别人重要的文档时,这种方法很有帮助。您还能够使用相同的方法执行一些高难度的 UNIX 操作。
恢复删除的文档
当 UNIX 电脑受到入侵时,常见的情况是日志文档被删除,以掩盖攻击者的踪迹。管理错误也可能导致意外删除重要的文档,比如在清理旧日志时,意外地删除了数据库的活动事务日志。有时能够恢复这些文档,并且
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




