是util-linux 的flock
基于flock()
Linux C API实现?
我们能否仅通过查看锁定文件来判断某个命令是否正在由进程运行?我发现当由 守护的命令flock
完成运行时,锁定文件似乎没有变化。这是运行时和运行完成后的情况:
$ ls -l ../sleep.flock.file
-rw-rw-r-- 1 t t 0 Oct 30 14:01 ../sleep.flock.file
$ ls -l ../sleep.flock.file
-rw-rw-r-- 1 t t 0 Oct 30 14:01 ../sleep.flock.file
谢谢。
答案1
是的。中明确指出man 1 flock
该flock
命令使用flock()
和man 2 flock
注释部分说这flock()
是从Linux内核2.0开始通过系统调用实现的。
答案2
$ flock -xn /home/vagrant/forever.lck -c /var/tmp/forever.sh
上面的集群命令将打开 /home/vagrant/forever.lck 文件,其中包含独占 (-x) 文件锁并执行指定的命令(-c)。 [forever.sh 使用 sleep 25d 命令需要 25 天才能完成]
如果我们运行第二个实例,flock 将识别出已经存在独占文件锁。
$ flock -xn /home/vagrant/forever.lck -c /var/tmp/forever.sh
$ echo $?
1
当flock无法锁定文件并且使用-n(非阻塞)标志执行时,flock命令将静默退出,并带有指示发生错误的退出代码。
flock 的有用之处在于,文件锁将保持在原位,直到原始进程完成,此时,flock 将释放文件锁。无论该过程成功完成还是失败,都是如此。
锁是这里的关键东西,是看不见的ls
。