有沒有一種非常簡單可靠的方法可以在 linux 上創建一個唯一的鎖(文件)?不使用flock
編輯:我學會瞭如何使用flock進行排他鎖以及如何不弄亂它:https ://superuser.com/questions/1619940/flock-is-randomly-failing-on-desktop-pc-but-not-on -筆記本可能有缺陷/。我認為這個問題是不必要的,因為除了羊群之外沒有必要使用其他任何東西。但是……“重複刪除已回答的問題可能會導致您的帳戶被阻止詢問。您確定要刪除嗎?” 我不會刪除這個問題以免弄亂我的帳戶。如果留在這裡也可能有助於人們理解和使用flock。隨意刪除它。
舊的不必要的問題
例如:我想創建一個文件鎖以防止同時備份同一文件的嘗試,每次我啟動一個新終端時都會執行它,就像在可以同時啟動多個命名選項卡的 guake 上一樣。
我不想使用
flock
. 我很難理解和嘗試使用它:(我認為最大的問題是
flock -x asdf.txt
asdf.txt 是一個真實存在的文件,它給出了“flock: bad file descriptor: ‘asdf.txt’”,這感覺不像是使用者友好的實現。我從手冊頁中得到了那個例子,我又被卡住了。感覺好像我無法解釋這個問題,但問題出在我的測試案例(答案)上:我需要一個文件鎖來專門做事情,而我總是很難用羊群來做到這一點。 .
只需使用 ShellShoccar -jpn/misc-tools 中的四個 shellscript 命令:pexlock、pshlock、punlock 和 pcllock ;排他鎖和共享鎖分別用
(set -C; :>filename)
和實現mkdir
,因此它不僅對 GNU/Linux 有用,對任何其他 POSIX 環境也有用。
我一直在使用符號連結創建重試,如下所示:
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
如果還有其他簡單易懂和使用的方法,我很想知道!