所以有2個腳本:A和B,都要寫入同一個文件。兩個腳本都可以同時寫入文件。我怎樣才能鎖定文件?當腳本A正在寫入文件時,腳本B必須等到文件被解鎖。Linux上的文件鎖
我嘗試這樣做:
while [ -f $LOCK ]
do
sleep 0.1
done
touch $LOCK
#action
rm $LOCK
上面,它可能腳本的問題,即A和B的尋找在同一時間的$ LOCK,他們無法找到不會開始寫作。 有什麼幫助嗎?
所以有2個腳本:A和B,都要寫入同一個文件。兩個腳本都可以同時寫入文件。我怎樣才能鎖定文件?當腳本A正在寫入文件時,腳本B必須等到文件被解鎖。Linux上的文件鎖
我嘗試這樣做:
while [ -f $LOCK ]
do
sleep 0.1
done
touch $LOCK
#action
rm $LOCK
上面,它可能腳本的問題,即A和B的尋找在同一時間的$ LOCK,他們無法找到不會開始寫作。 有什麼幫助嗎?
試試這個:
腳本A打開文件然後設置屬性chattr +i test.txt
和腳本A之後完成使用chattr -i test.txt
。
例如:
腳本A
chattr +i test.txt
tail -n 50 /var/log/maillog > test.txt
chattr -i test.txt
腳本B
chattr +i test.txt
tail -n 50 /var/log/messages > test.txt
chattr -i test.txt
不會'chattr +我text.txt'阻止任何*進程修改文件?如果是這樣,那就不會像OP想要的*寫*鎖那樣。 –
在此標誌存在期間,沒有人可以更改此文件(作爲根目錄)。所以你可以使用'PID'進行鎖定修改,如'echo $$' –
這是行不通的。首先,「腳本A是打開的文件,然後設置屬性」chattr + i test.txt「引入了一個競爭條件,腳本B可以*打開文件然後調用'chattr ...'。其次,發佈的代碼不能正確同步多個'chattr ...'調用。例如,如果有兩個對'chattr + i ...'的調用,可能應該有兩個調用'chattr -i ...'來正確地重置該屬性。但這不是'chattr' utiliity的工作方式。 –
另一種可能性是:
echo $$ >> lockfile
locked_by=$(head -1 lockfile)
if [ $$ = $locked_by ] ; then
echo "Hurray! the file is mine!"
#do stuff
rm lockfile
else
echo "$locked_by has the lock, sorry"
fi
的echo $$ >> lockfile
是,大部分時間,一個足夠的原材料。
您可以使用kill -0
和if
構造。例如:
kill -0 $lockPid
if [[ $? == 0 ]];then
echo "File locked"
break
else
bash script2.sh
fi
一個解決方案是使用lockfile
腳本一個
while :
do
lockfile test.lock
echo A >> test
rm -f test.lock
sleep 1
done
腳本B
while :
do
lockfile test.lock
echo B >> test
rm -f test.lock
sleep 1
done
你必須把lockfile
和之間的文件寫入rm
用於任何腳本編寫的命令。所以只有一個會隨時修改,其餘的將會等待。您還可以設置超時等,詳情man locktime
flock,lockfile或[dotlockfile](https://tracker.debian.org/pkg/liblockfile) –
這不是一個真正容易解決的問題,便攜式,用腳本強大的方式。換句話說,shell腳本實際上是這項工作的錯誤工具。 –