手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

使用 lsof 查找打开的文档

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
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/homelsof /export/home/(请注意尾部的斜杠)有所区别。第一种方式能够正常工作,因为他指向了装入点。第二种方式不会生成任何输出,因为他指向了目录。假如您在 Shell 中使用 Tab 键自动完成命令,那么可能碰到这个问题,其中会帮助您添加结尾的斜杠。在这种情况下,您能够删除这个斜杠或使用 D 指定目录。前者是最好选择的方法,因为和指定任意的目录相比,其执行速度更快。

不常见的用法

在前面的部分中,我们研究了 lsof 的基本用法,即显示打开的文档和控制他们的进程之间的关系。当您想对系统进行一些烦琐的操作,而又不希望破坏别人重要的文档时,这种方法很有帮助。您还能够使用相同的方法执行一些高难度的 UNIX 操作。

恢复删除的文档

当 UNIX 电脑受到入侵时,常见的情况是日志文档被删除,以掩盖攻击者的踪迹。管理错误也可能导致意外删除重要的文档,比如在清理旧日志时,意外地删除了数据库的活动事务日志。有时能够恢复这些文档,并且

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!