标签: flock

为什么 flock 不清理锁文件?

进程完成后,我看到锁文件没有被删除?有什么理由flock保留文件吗?另外如何flock知道是否获得了锁?

这是来自crontab文件的示例

* * * * * flock python <script_name>.py
Run Code Online (Sandbox Code Playgroud)

lock flock

16
推荐指数
1
解决办法
9447
查看次数

传递多个命令到flock

flock -x -w 5 ~/counter.txt 'COUNTER=$(cat ~/counter.txt); echo $((COUNTER + 1)) > ~/counter.txt'
Run Code Online (Sandbox Code Playgroud)

我如何将多个命令传递给flock上面的示例?

据我了解,flock采用不同的标志(-x 表示独占,-w 表示超时),然后是要锁定的文件,然后是要运行的命令。我不确定如何将两个命令传递给这个函数(用锁定文件的内容设置变量,然后增加这个文件)。

我的目标是通过在每次脚本尝试访问counter.txt文件时锁定文件来为文件创建一个有点原子的增量。

command-line shell lock flock

13
推荐指数
1
解决办法
8550
查看次数

Flock 似乎不起作用

我最近一直在尝试为一个小项目创建一个 shell 脚本,但由于某种原因,该flock命令对我不起作用。每当我在子 shell 中以原子方式调用它并将其置于后台时,其他程序似乎能够读取/写入锁定的文件。

Bash 会话:

guest@guest ~ $ touch ./temp
guest@guest ~ $ ( flock -x 3 && sleep 99999999999; ) 3>./temp &
[1] 22874
guest@guest ~ $ cat ./temp 
guest@guest ~ $ echo this is a test >./temp 
guest@guest ~ $ cat ./temp 
this is a test
guest@guest ~ $ jobs
[1]+  Running                 ( flock -x 3 && sleep 99999999999 ) 3>./temp &
guest@guest ~ $ bash --version
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Copyright (C) …
Run Code Online (Sandbox Code Playgroud)

file-descriptors subshell flock

8
推荐指数
1
解决办法
8332
查看次数

在 shell 脚本中聚集文件描述符

我认为这会给我不间断的begin-end配对,但它没有:

#!/bin/bash
fun()(
    flock 1 || { echo >&2 "$BASHPID: FAIL: $?"; exit 1; }
    echo "$BASHPID begin"
    sleep 1;
    echo "$BASHPID end"
)
fun &
fun &
fun &
fun &
fun &
fun &
fun &
fun &
fun &
wait
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

shell-script flock

5
推荐指数
1
解决办法
2672
查看次数

如何从shell脚本锁定文件?

我想通过文件锁同步两个 Bash 脚本。这该怎么做?Zsh 有zsystem flock调用,但是 Bash 也可以使用更“shellish”的方法吗?

bash shell-script lock flock

4
推荐指数
1
解决办法
2万
查看次数

Linux 中陈旧文件锁的处理和 flock 的稳健使用

我有一个定期通过 cron 执行的脚本(每隔几分钟)。然而,脚本不应并行运行多次,有时运行时间会更长,因此我想实现一些锁定,即如果前一个实例已经在运行,请确保脚本提前终止。

根据各种建议,我有一个看起来像这样的锁定:

lock="/run/$(basename "$0").lock"
exec {fd}<>"$lock"
flock -n $fd || exit 1
Run Code Online (Sandbox Code Playgroud)

这应该调用 exit 1 以防脚本的另一个实例仍在运行。

现在问题来了:似乎有时即使脚本已经终止,陈旧的锁仍然存在。这实际上意味着 cron 永远不会再次执行(直到下次重新启动或删除锁定的文件),这当然不是我想要的。

我发现有列出现有文件锁的 lslocks 命令。它显示了这一点:

(unknown)        2732 FLOCK        WRITE 0     0   0 /run...                                                                 
Run Code Online (Sandbox Code Playgroud)

进程(在这种情况下为 2732)不再存在(例如在 ps aux 中)。我也不清楚为什么它不显示完整的文件名(即只有 /run...)。lslocks 有一个参数 --notrucate 在我看来它可能会避免截断文件名,但这不会改变输出,它仍然是 /run...

所以我有多个问题:

  • 为什么会有这些锁,什么情况会导致 flock 的锁存在于进程的生命周期之外?
  • 为什么 lslocks 不显示完整路径/文件名?
  • 什么是避免这种情况并使脚本中的锁定更健壮的好方法?
  • 有没有办法在不重新启动的情况下清理陈旧的锁?

shell-script lock flock

4
推荐指数
1
解决办法
1433
查看次数

在 zsh 中使用集群失败,但在 bash 中可以使用?

在 Z shell 中使用https://unix.stackexchange.com/a/274499/5132的答案中的机制:

(
flock -x 200

echo "test";

) 200>mylockfile2
Run Code Online (Sandbox Code Playgroud)

回报

zsh: parse error near `200'
Run Code Online (Sandbox Code Playgroud)

在 bash 中它可以正常工作。这里可能有什么问题?

zsh flock

2
推荐指数
1
解决办法
732
查看次数