如何确定 Linux 中哪个进程打开了文件?

如何确定 Linux 中哪个进程打开了文件?

我想确定哪个进程拥有锁文件的所有权。锁文件只是一个已创建的特定名称的文件。

那么,我如何才能确定 Linux 中哪个进程打开了某个文件?最好使用一行代码或特定的 Linux 工具解决方案。

答案1

您还可以使用fuser以下方法:

~> less .vimrc
# put in background
~> fuser .vimrc
.vimrc:              28135
~> ps 28135
  PID TTY      STAT   TIME COMMAND
28135 pts/36   T      0:00 less .vimrc

答案2

在大多数 Linux 系统上,lsof NAME该工作如下:

fin@r2d2:~$ lsof /home/fin
COMMAND   PID USER   FD   TYPE DEVICE SIZE    NODE NAME
bash    21310  fin  cwd    DIR    8,1 4096 5054467 /home/fin
lsof    21320  fin  cwd    DIR    8,1 4096 5054467 /home/fin
lsof    21321  fin  cwd    DIR    8,1 4096 5054467 /home/fin
fin@r2d2:~$

答案3

打开一个文件并不是一个锁,因为如果每个进程都必须先检查文件是否打开,如果是则不继续,如果不是则创建/打开它,那么两个进程可以同时检查,都发现它没有打开,然后都创建或打开它。

要将文件用作锁,检查和锁定操作必须是单个不可中断的操作。您可以在 Unix 文件系统中通过创建具有只读模式的文件并将其移除以解锁来实现这一点。如果文件存在(并且是只读的),则文件创建将失败,因此您可以在单个原子操作中获得检查和锁定。

如果你的锁定进程是一个作为守护进程运行的 shell 脚本,你可以使用umask每个进程的设置来设置新文件创建的权限,从而获得这种效果:

oldumask=$(umask)
umask 222 # 创建所有者不可写入的文件
如果回显 $$ > /var/lock/foo
然后
    :锁定成功
别的
    :锁定失败
umask $oldumask
这还将所属进程的 PID 写入文件,从而解决了您的其他问题:cat /var/lock/foo
至于具体问题“哪些进程打开了此文件?”,当您想要卸载文件系统但无法卸载时(因为某些进程在其中打开了文件),这会很有用。如果您没有这些命令可用,您可以/proc以 root 身份询问:

ls -l /proc/*/cwd | grep '/var/lock/foo$'

或者,作为普通用户:

ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'

答案4

我发现使用接受的答案并没有列出使用我的目录(ubuntu 14.04)的进程。

最后,我使用 lsof(列出打开的文件)并 grep 其输出来查找有问题的进程:

lsof | egrep "<regexp-for-your-file>"

相关内容