Linux上的文件锁定

时间:2017-08-14 14:52:20

标签: bash file locking

所以有两个脚本:A和B,都想写入同一个文件。两个脚本都可以同时写入文件。我该如何锁定文件?当脚本A正在写入文件时,脚本B必须等到文件被解锁。

我试过这个: 的

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

的 上面的脚本问题是可能的,A和B都在同时寻找$ LOCK,他们无法开始写作。 有什么帮助吗?

4 个答案:

答案 0 :(得分:2)

另一种可能性是:

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在大多数情况下都足够原子。

答案 1 :(得分:1)

试试这个:

脚本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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

解决方案是使用lockfile

脚本A

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

您必须在lockfilerm命令之间编写文件,以便编写任何脚本。因此,任何时候只有一个会修改,其余的将等待。您还可以设置超时等,以获取详细信息man locktime