我如何获得以下内容的列表:
- 当前正在由
inotify
、 和监视的路径名 - 监视进程的PID
我问是因为我发现syncthing
的inotify
手表阻止我的磁盘被卸载。
如下所示,列表中没有出现任何lsof
内容fuser
。
我猜得很好syncthing
...如果磁盘由于以下原因而无法卸载,我如何消除将来的猜测inotify
?
# umount /media/backup
umount: /media/backup: target is busy.
# lsof +f -- /media/backup/
# echo $?
1
# fuser -vmM /media/backup/
USER PID ACCESS COMMAND
/media/backup: root kernel mount /media/backup
# systemctl stop syncthing@ravi
# umount /media/backup
# echo $?
0
答案1
也许fdinfo
手表的 fd 会有用:
$ readlink /proc/$(pgrep inotify)/fd/3
anon_inode:inotify
$ cat /proc/$(pgrep inotify)/fdinfo/3
pos: 0
flags: 00
mnt_id: 11
inotify wd:1 ino:357a sdev:700000 mask:fff ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:7a35000000000000
这sdev
似乎是主要:次要设备编号组合,如 的输出所示lsblk
,例如:
$ lsblk | grep 7
loop0 7:0 0 80.5M 1 loop /snap/core/2462
(我确实在监视/snap/core/2462
。)
对于我的/dev/sda1
which is 8:1
,输出如下所示:
pos: 0
flags: 00
mnt_id: 11
inotify wd:1 ino:aae1b sdev:800001 mask:fff ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:1bae0a0038e16969
即使未列出正在监视的特定目录或文件,这也足以找出阻止卸载的原因。
答案2
(未完成的答复)
谢谢穆鲁的回答为了启动。
使用以下信息/proc/[pid]/fdinfo/[fd#]
:
- 获取安装点路径名和设备,用作或的
mnt_id
索引/proc/[pid]/mountinfo
可能使用全局挂载信息 - 转换
ino
为十进制 - 从 inode 查找路径名:
btrfs
(需要路径名)ext4
(需要设备,可能通过解释 /proc/<PID>/fdinfo/<FD> 中的 `sdev` 字段)
可能 lsof:仅列出特定类型的文件和a_inode
。
作为 shell 脚本来说,速度太慢了grep
。也许/proc信息的系统调用接口。