編集:排他的ロックのためにクラスタリングを使用する方法とそれを台無しにしない方法を学びました。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の4つのシェルスクリプトコマンドを使用してください。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
他にわかりやすく使いやすい方法があれば私も知りたいです!