Answers:
您也可以使用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
if [
热熔器“ $ file”`]; 然后退出`
ls
-如果出现错误(例如,指定了无效的选项)或找不到文件(如果成功报告信息,则返回0 ),它将返回退出代码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:~$
cwd
行(报告用作进程的当前工作目录)仅报告目录。
打开文件不是锁,因为如果每个进程都必须先检查文件是否先打开而不是打开,或者如果没有打开则创建/打开文件,那么两个进程可以很好地同时检查,两者都可以找到它没有打开,然后创建或打开它。
要将文件用作锁定,检查和锁定操作必须是单个不可中断的操作。您可以在Unix文件系统中通过创建只读模式的文件并将其删除以解锁来实现。如果文件存在(并且是只读的),则文件创建将失败,因此您可以在单个原子操作中进行检查并锁定。
如果锁定过程是将作为守护程序运行的Shell脚本,则可以通过使用umask
逐个进程设置来设置设置新文件的权限,从而获得这种效果:
oldumask = $(umask) umask 222#创建也对所有者不可写的文件 如果echo $$> / 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$'
如果您想知道哪个确切的进程的文件描述符链接到您的文件,而无需lsof
或fuser
-通过/proc
以下方式搜索:
$ find /proc -regex '\/proc\/[0-9]+\/fd\/.*' -type l -lname "*$1*" -printf "%p -> %l\n" 2> /dev/null
用$1
您要搜索的打开的文件名替换。您可以修改显示-printf
的内容,或egrep -o '[0-9]+' | head -1
将其用于该流程的信息。ps -Fp <pid>
在通过@fin答案是最好的答案,很明显,但回答@ JoseLSegura的评论,如果这是不可用的,上面的解决方案是我的回应。$ lsof <filename>