Linux上的文件锁

3
所以有两个脚本:A和B,它们都想写入同一个文件。这两个脚本可能同时想要写入该文件。如何锁定该文件?当脚本A正在向文件写入时,脚本B必须等待文件解锁后才能进行写入。
我尝试了这个:
while [ -f $LOCK ]
do
    sleep 0.1
    done
touch $LOCK
#action
rm $LOCK

上面的脚本存在问题,可能会导致A和B同时查找$LOCK,并且它们无法找到并开始写入。需要帮忙吗?


1
flock,lockfile或dotlockfile - Todd A. Jacobs
这并不是一个可以轻松用脚本以便于移植和稳健的方式解决的问题。换句话说,一个 shell 脚本并不是这项工作的正确工具。 - Andrew Henle
3个回答

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
请尝试以下步骤:
脚本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 +i text.txt” 不会阻止任何进程修改文件吗?如果是这样,那就不会起到 OP 想要的“写入”锁定作用。 - Andrew Henle
1
只要这个标志存在,没有人可以作为 root 更改此文件。因此,您可以使用“PID”来锁定修改,例如“echo $$”。 - Vitaliy Kalyuzhnyak
那样做行不通。首先,“脚本A打开文件然后设置属性chattr +i test.txt”引入了竞态条件,其中脚本B也可以打开文件然后调用chattr ...。其次,发布的代码没有正确同步多个chattr ...调用。例如,如果有两个对chattr +i ...的调用,则可能应该有两个对chattr -i ...的调用以正确重置属性。但这不是chattr实用程序的工作方式。 - Andrew Henle
1
任何人都可以打开文件,但没有人可以更改它。然后您需要使用锁定文件或查找进程脚本A或B。使用PS命令或查找PID(kill -0 $PID)。 - Vitaliy Kalyuzhnyak

1
你可以使用kill -0if语句。例如:
kill -0 $lockPid
if [[ $? == 0 ]];then
    echo "File locked"
    break
else
    bash script2.sh
fi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接