2017-08-14 90 views
3

所以有2個腳本:A和B,都要寫入同一個文件。兩個腳本都可以同時寫入文件。我怎樣才能鎖定文件?當腳本A正在寫入文件時,腳本B必須等到文件被解鎖。Linux上的文件鎖

我嘗試這樣做:

while [ -f $LOCK ] 
do 
    sleep 0.1 
    done 
touch $LOCK 
#action 
rm $LOCK 

上面,它可能腳本的問題,即A和B的尋找在同一時間的$ LOCK,他們無法找到不會開始寫作。 有什麼幫助嗎?

+1

flock,lockfile或[dotlockfile](https://tracker.debian.org/pkg/liblockfile) –

+0

這不是一個真正容易解決的問題,便攜式,用腳本強大的方式。換句話說,shell腳本實際上是這項工作的錯誤工具。 –

回答

3

試試這個:

腳本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 
+0

不會'chattr +我text.txt'阻止任何*進程修改文件?如果是這樣,那就不會像OP想要的*寫*鎖那樣。 –

+1

在此標誌存在期間,沒有人可以更改此文件(作爲根目錄)。所以你可以使用'PID'進行鎖定修改,如'echo $$' –

+0

這是行不通的。首先,「腳本A是打開的文件,然後設置屬性」chattr + i test.txt「引入了一個競爭條件,腳本B可以*打開文件然後調用'chattr ...'。其次,發佈的代碼不能正確同步多個'chattr ...'調用。例如,如果有兩個對'chattr + i ...'的調用,可能應該有兩個調用'chattr -i ...'來正確地重置該屬性。但這不是'chattr' utiliity的工作方式。 –

1

另一種可能性是:

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是,大部分時間,一個足夠的原材料。

2

您可以使用kill -0if構造。例如:

kill -0 $lockPid 
if [[ $? == 0 ]];then 
    echo "File locked" 
    break 
else 
    bash script2.sh 
fi 
0

一個解決方案是使用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