当我尝试将分区重新安装为 时read-only
,出现错误/foo is busy
。我可以列出打开的所有/foo
文件
lsof /foo
但这并没有告诉我文件是否打开read-only
或read-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