lsof:显示以读写方式打开的文件

lsof:显示以读写方式打开的文件

当我尝试将分区重新安装为 时read-only,出现错误/foo is busy。我可以列出打开的所有/foo文件

lsof /foo

但这并没有告诉我文件是否打开read-onlyread-write.有没有办法只列出打开为 的文件read-write

答案1

要具体回答这个问题,你可以这样做:

lsof /foo | awk 'NR==1 || $4~/[0-9]+u/'

read-write这将显示在安装点下打开的文件foo。但是,您可能真正想做的是列出所有打开以供写入的文件。这将包括打开的文件write-only以及打开的文件read-write。为此你会这样做:

lsof /foo | awk 'NR==1 || $4~/[0-9]+[uw]/'

FD如果输出中的第四个字段并且其他字段都不为空,这些命令应该可以工作。当我在命令中包含路径时,我在 Debian 上就是这种情况lsof,但是如果我不包含路径,它会打印出额外的TID字段,该字段有时是空白的(并且会造成混淆awk)。里程可能因发行版或lsof版本而异。

答案2

查看FD的输出中的列值lsof。例如:

sudo lsof +d /foo

联机帮助页描述了解释; 'r' 表示读取; “w”表示写入,“u”表示读写访问。

这可以很容易地用于列出感兴趣的对象:

sudo lsof +d /foo | awk '/$4~/u/ {print $NF}'   

答案3

我没有任何运气使用lsof列出具有文件读写访问权限的进程(也许我只是忽略了我的版本中的选项lsof),但我最终发现这份数字海洋指南其中展示了如何使用获取该信息fuser

以下是 Ubuntu 16.04 盒子的一些测试输出:

$ sudo fuser -v /etc/os-release

                     用户PID访问命令
/usr/lib/os-release: root 827 f.... snapd

$ sudo fuser -v /proc/kmsg

                     用户PID访问命令
/proc/kmsg: syslog 989 f.... rsyslogd

如中所述指导:

上面的输出显示,当在详细模式下运行时,fuse 实用程序提供有关 USER、PID、ACCESS 和 COMMAND 的信息。访问类型有多种,如 e(正在运行的可执行文件)、r(根目录)、f(打开文件。默认显示模式下省略 f)、F(打开文件进行写入,默认显示模式下省略 F)等m(mmap'ed 文件或共享库)。

在上面的每个示例中,文件都打开以供读取。以下是打开用于写入的文件的示例:

$ sudo fuser -v /run/systemd/journal/syslog

                     用户PID访问命令
/运行/systemd/日志/系统日志:
                     根 1 F....systemd
                     系统日志 989 F....rsyslogd

在这里您可以看到 和 都systemd具有对“文件”(在本例中为套接字)rsyslogd的写访问权限。/run/systemd/journal/syslog

相关内容