【问题标题】:lsof command doesn't look in specified directory when i specify user当我指定用户时,lsof 命令不在指定目录中查找
【发布时间】:2013-02-13 20:24:02
【问题描述】:

所以我正在编写一个 python 脚本,我的目标是使用 lsof 为本地用户列出特定目录(我的主文件夹)下的所有打开文件,并且只输出“uniq”条目。

我的脚本如下所示:

import os, sys, getpass
user = getpass.getuser()
cmd = "lsof -u " + user + " +d ~ | sort | uniq"
os.system(cmd)

这种做我想做的事,它为当前本地用户做 lsof,但它无法在我指定的主目录中专门查找。相反,它在根目录上执行 lsof,并为用户列出整个文件系统的所有 lsof。但是,当我在没有-u user 的情况下执行相同的命令时,它看起来专门在主目录中。我一直在研究为什么会这样,是的,我尝试使用+d /home/+d ~/home/ 而不是仅仅使用+d ~ 来让它工作但没有成功,所以我有点难过。任何建议都会很棒:)

【问题讨论】:

  • 您为什么期望+d /home/+d ~/home/ 做与+d ~ 类似的事情?通常,~ 将引用类似/home/me 的东西,而不仅仅是/home,并且您不太可能在/home 中打开任何文件,除了/home/me。 (请注意,+d 不是递归的——如果需要,请使用+D。)而~/home/ 将是/home/me/home/,它可能甚至不存在。那么,你想通过尝试来完成什么?

标签: python bash lsof


【解决方案1】:

来自man page

通常,特别说明的列表选项是 ORed - 即,指定 -i 选项而不指定地址,而 -ufoo 选项会生成所有网络文件或属于用户 ''foo'' 拥有的进程的文件的列表。

有一些例外,但它们都不适用于您的情况。

所以,-u me +d ~ 的意思是“我打开的所有文件或在我的主目录中。

那么你如何做你想做的事?

-a 选项可用于 AND 选择。例如,指定 -a、-U 和 -ufoo 会生成仅属于用户 ''foo'' 拥有的进程的 UNIX 套接字文件的列表。

在里面输入-a

cmd = "lsof -a -u " + user + " +d ~ | sort | uniq"

顺便说一句,一般来说,你真的不想在 Python 中使用 os.system,这就是为什么 the documentation 专门说:

subprocess 模块为生成新进程和检索其结果提供了更强大的工具;使用该模块优于使用此功能。请参阅 subprocess 文档中的 Replacing Older Functions with the subprocess Module 部分,了解一些有用的方法。

真的,为什么要使用sortuniq 而不是在Python 中进行排序?或者,如果您只想让这个 shell 管道运行,而不是在 Python 中以任何方式处理它,为什么首先使用 Python 而不是 bash?

【讨论】:

    【解决方案2】:

    lsof 默认使用 OR 将选项连接在一起,尝试添加 -a 标志以将它们组合在一起。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      • 2012-10-10
      • 2017-03-28
      • 1970-01-01
      相关资源
      最近更新 更多