编辑:我学会了如何使用集群进行独占锁以及如何不弄乱它:https://superuser.com/questions/1619940/flock-is-randomly-failing-on-desktop-pc-but-not-on-notebook-could-be-defectiv/。我认为这个问题是不必要的,因为除了flock之外不需要使用其他任何东西。但是...“重复删除已回答的问题可能会导致您的帐户被阻止提问。您确定要删除吗?”我不会删除这个问题,以免弄乱我的帐户。如果留在这里也可能有助于人们理解和使用flock。请随意删除它。
不必要的老问题
例如:我想创建一个文件锁来防止同时备份同一文件,该文件在每次启动新终端时运行,就像在 guake 上可以同时启动多个命名选项卡一样。
我不想用flock
。我很难理解并尝试使用它:(
我认为最大的问题是flock -x asdf.txt
asdf.txt 是一个真实存在的文件,并且它给出了“flock:错误的文件描述符:'asdf.txt'”,这感觉像是一个不用户友好的实现。我从手册页得到了这个例子,但我又陷入困境了。感觉我无法解释这个问题,但问题出在我的测试用例(答案)上:我需要一个文件锁来专门做事情,而且我总是很难尝试用集群来做到这一点。 。
答案1
只需使用四个 shellscript 命令:pexlock、pshlock、punlock 和 pcllockShellShoccar-jpn/misc-工具;独占锁和共享锁分别用(set -C; :>filename)
和实现mkdir
,因此它不仅适用于 GNU/Linux,而且适用于任何其他 POSIX 环境。
答案2
我一直在使用符号链接创建重试,如下所示:
while true;do
if ln -s "/a/b/c/myExisingRealFile.ext" /tmp/myFileSymlink.lock 2>/dev/null;then
: #do something
rm /tmp/myFileSymlink.lock
break
fi
done
使用(bash)myLockTest.sh 进行测试:
#!/bin/bash
echo "the idea is: after every OK must always follow a single REMOVED"
echo "so also no subsequent OKs."
echo >/tmp/tstMyScript.sh;
export strLock="/tmp/tstUniqueLock.lock";
rm -v "$strLock" 2>/dev/null;
trap -- "echo EXIT;rm -v "$strLock"" EXIT
trap -- "echo INT;rm -v "$strLock"" INT
FUNClock(){
n=0;
while true;do
if ln -s "/tmp/tstMyScript.sh" "$strLock" 2>/dev/null;then
echo "$n:$BASHPID:ok";
rm -v "$strLock";
break;
fi;
echo "$n:$BASHPID:retry:$((++n))";
sleep 0.25
done;
};export -f FUNClock;
for((i=0;i<100;i++));do FUNClock&:;done # lower from 100 to 1 if you are unsure, then increase slowly
如果还有其他简单易懂和使用的方法,我也想知道!