편집: 배타적 잠금을 위해 클러스터링을 사용하는 방법과 이를 망치지 않는 방법을 배웠습니다.https://superuser.com/questions/1619940/flock-is-randomly-failing-on-desktop-pc-but-not-on-notebook-could-be-defectiv/. 무리 외에 다른 것을 사용할 필요가 없기 때문에 이 질문은 불필요하다고 생각합니다. 하지만... "답변한 질문을 중복 삭제하면 질문이 차단될 수 있습니다. 삭제하시겠습니까?" 계정이 복잡해지지 않도록 이 질문을 삭제하지 않겠습니다. 여기에 남겨두면 사람들이 무리를 이해하고 사용하는 데 도움이 될 수도 있습니다. 삭제해 주시기 바랍니다.
불필요하고 오래된 문제
예: guake에서 여러 개의 명명된 탭을 동시에 시작할 수 있는 것처럼 새 터미널이 시작될 때마다 실행되는 동일한 파일의 동시 백업을 방지하기 위해 파일 잠금을 만들고 싶습니다.
나는 그것을 사용하고 싶지 않습니다 flock
. 이해하고 사용하는데 어려움을 겪고 있습니다 :(
내 생각에 가장 큰 문제는 flock -x asdf.txt
asdf.txt가 실제 존재하는 파일이고 사용자에게 친숙하지 않은 구현처럼 느껴지는 "flock: Bad file descriptor: 'asdf.txt'"를 제공한다는 것입니다. 맨 페이지에서 이 예제를 얻었지만 다시 막혔습니다. 이것을 설명할 수 없는 것 같지만 문제는 내 테스트 사례(답변)에 있습니다. 구체적으로 작업을 수행하려면 파일 잠금이 필요하며 클러스터를 사용하여 이 작업을 수행하는 데 항상 어려움을 겪었습니다. .
답변1
pexlock, pshlock, punlock 및 pcllock의 네 가지 쉘스크립트 명령을 사용하세요.ShellShoccar-jpn/misc-tools;배타적 잠금과 공유 잠금은 각각 (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
다른 이해하기 쉽고 사용하기 쉬운 방법이 있다면 저도 알고 싶습니다!