有没有一种真正简单可靠的方法来在Linux上创建唯一的锁(文件)?不使用“flock”

有没有一种真正简单可靠的方法来在Linux上创建唯一的锁(文件)?不使用“flock”

编辑:我学会了如何使用集群进行独占锁以及如何不弄乱它: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.txtasdf.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

如果还有其他简单易懂和使用的方法,我也想知道!

相关内容