进程完成后,我看到锁文件没有被删除?有什么理由flock保留文件吗?另外如何flock知道是否获得了锁?
这是来自crontab文件的示例
* * * * * flock python <script_name>.py
Run Code Online (Sandbox Code Playgroud) 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文件时锁定文件来为文件创建一个有点原子的增量。
我最近一直在尝试为一个小项目创建一个 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) 我认为这会给我不间断的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)
我究竟做错了什么?
我想通过文件锁同步两个 Bash 脚本。这该怎么做?Zsh 有zsystem flock调用,但是 Bash 也可以使用更“shellish”的方法吗?
我有一个定期通过 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...
所以我有多个问题:
在 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 中它可以正常工作。这里可能有什么问题?