我们能否仅通过查看集群锁定文件来判断某个命令是否正在由进程运行?

我们能否仅通过查看集群锁定文件来判断某个命令是否正在由进程运行?

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 flockflock命令使用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

摘自这篇文章

相关内容