那么,如何确定在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:~$
评论
如果没有lsof,该怎么办?
–JoseLSegura
2014年1月9日在11:54
@JoseLSegura:我假设您足够机智,回答“然后安装lsof”对您毫无用处。您能详细说明您的问题吗?如果您没有root用户,则可能没有priv来查找其他用户是否以任何方式打开了文件。
–迈克尔·谢珀(Michael Scheper)
2015年12月10日,0:48
这似乎不适用于文件,仅适用于目录
–詹森
19年4月28日在4:29
@Jason:它确实适用于文件,但是cwd行(报告用作进程的当前工作目录)仅报告目录。
– reinierpost
19-10-7的16:07
#3 楼
打开文件不是锁,因为如果每个进程都必须先检查文件是否先打开而不是打开,或者如果没有打开则创建/打开文件,那么两个进程可以很好地同时检查,两者都可以找到确认它没有打开,然后创建或打开它。要使用文件作为锁定,检查和锁定操作必须是单个不可中断的操作。您可以在Unix文件系统中通过创建只读模式的文件并将其删除以解锁来实现此目的。如果文件存在(并且是只读文件),则文件创建将失败,因此您将在单个原子操作中进行检查并锁定。
如果锁定过程是将运行的Shell脚本,作为守护程序,您可以通过使用
umask
获得此效果,cat /var/lock/foo
是一个按进程设置,用于设置使用以下命令创建新文件的权限:oldumask=$(umask) umask 222 # create files unwritable to owner too if echo $$ > /var/lock/foo then : locking succeeded else : locking failed fi umask $oldumask
拥有进程的PID到文件中,这可以解决您的另一个问题:
/proc
关于特定问题“哪个进程打开了该文件?”,当您要卸载文件系统时,这可能很有用,但是不能,因为某些进程已打开文件。如果没有可用的命令,则可以以root用户身份访问ls -l /proc/*/cwd | grep '/var/lock/foo$'
:ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'
,或者以普通用户身份访问:
q4312079q
评论
ls -l方法适用于Linux,但似乎不适用于CygWin:那里没有有关文件锁定的信息。你不知道该怎么解决吗?谢谢。
– Sopalajo de Arrierez
2014年4月9日在21:23
不,您不会为锁定创建只读文件,因为当您的应用崩溃时,该文件仍将存在。在您崩溃的应用后,强迫用户清除这些废话。
– polkovnikov.ph
18-3-13在20:24
#4 楼
如果您想知道哪个确切进程的文件描述符链接到没有lsof
或fuser
的文件,请通过/proc
搜索:$ find /proc -regex '\/proc\/[0-9]+\/fd\/.*' -type l -lname "**" -printf "%p -> %l\n" 2> /dev/null
用要搜索的打开文件名替换
。您可以修改-printf
的任何内容,也可以将其插入egrep -o '[0-9]+' | head -1
以与ps -Fp <pid>
一起使用以获取该进程的信息。@fin的
$ lsof <filename>
答案显然是最好的答案,但是要回答@ JoseLSegura的评论,如果此评论不可用,则上述解决方案是我的回应。评论
这正是我想要的。但是为什么总是返回1?
–山姆·托马斯(Sam Thomas)
20年4月6日在20:45
#5 楼
我发现使用接受的答案并没有列出正在使用目录(ubuntu 14.04)的进程。最后,我使用了lsof(列出打开的文件)并对其输出进行grep查找。令人反感的过程:
lsof | egrep "<regexp-for-your-file>"
评论
使用lsof的一种更清洁,更快捷的方法是它的选项-R。例如:lsof -R [文件名]
– tron5
19年5月24日在7:05
评论
很棒,但是要在脚本中使用它,我必须检查输出长度。
–碎肉
13年8月21日在7:39
输出长度是什么意思?
–内森·费尔曼(Nathan Fellman)
13年8月21日在8:40
如果[定影器“ $ file”`];然后退出
–碎肉
13年8月21日在9:05
热熔器的退出代码行为异常。它返回1个退出代码,并具有两种状态:A /一些内部错误,未找到检查的文件等,B /没有进程打开指定的文件。在情况A /中,一些错误消息被打印到其输出。不幸的是,当文件可用并通过某种方式打开时,会生成输出,但退出代码为0。如果热熔器以三个代码(而不是当前的两个代码)退出会更好。 lsoft的解决方法较差,因为它的运行速度较慢。
– Znik
2014年12月11日10:01
这基本上与ls遵循的模式相同-如果出现错误(例如,指定了无效的选项)或找不到文件(如果成功报告信息,则返回0),则返回退出代码2。
–斯科特
16年11月16日在0:48