【问题标题】:Need an in-depth explanation of how to use flock in Linux shell scripting需要深入解释如何在 Linux shell 脚本中使用flock
【发布时间】:2014-04-18 02:55:00
【问题描述】:

我正在开发一个小型 Raspberry Pi 集群(4 pis)。我有 3 个 Raspberry Pi 节点,它们将在头 Pi 上的 message.txt 文件中留下一条消息。头部 Pi 将循环检查 message.txt 文件以查看它是否有任何行。当它发生时,我想锁定文件,然后提取我需要的信息。我遇到的问题是我需要执行多个命令。我发现允许多个命令的唯一方法如下所示......

(
flock -s 200

# ... commands executed under lock ...

) 200>/var/lock/mylockfile 

这种方式的问题是它使用了一个子shell。问题是我有标记为job_1 job_2等的“工作”文件......我希望能够使用计数器。如果我将计数器的增量放在子外壳中,它将仅在子外壳的范围内考虑。如果我将增量​​拉出,那么在我增加计数器并锁定文件之前,另一个 pi 可能会添加一个条目。

我听说有一种方法可以锁定文件并运行多个命令和流控制,然后使用flock 将其全部解锁。不过,我还没有看到任何好的例子。

这是我当前的代码。

# Now go into loop to send out jobs as pis ask for more work
while [ $jobsLeftCount -gt 0 ]
do
echo "launchJobs.sh: About to check msg file"

msgLines=$(wc -l < $msgLocation)
if [ $msgLines ]; then
#FIND WAY TO LOCK FILE AND DO THAT HERE
echo "launchJobs.sh: Messages found. Locking message file to read contents"

(
flock -e 350
echo "Message Received"

while read line; do  
#rename file to be sent to node "job"
mv $jobLocation$jobName$jobsLeftCount /home/pi/algo2/Jobs/job
#transfer new job to each script that left a message
scp /home/pi/algo2/Jobs/job pi@192.168.0.$line:/home/pi/algo2/Jobs/
jobsLeftCount=$jobsLeftCount-1;
echo $line 
done < $msgLocation


#clear msg file
>$msgLocation
#UNLOCK MESG FILE HERE
) 350>>$msgLocation


echo "Head node has $jobsLeftCount remaining"


fi
#jobsLeftCount=$jobsLeftCount-1;
#echo "here is $jobsLeftCount file"
done

【问题讨论】:

    标签: linux bash shell locking


    【解决方案1】:

    如果子shell环境不可接受,请使用大括号代替group命令的括号:

    {
    flock -s 200
    
    # ... commands executed under lock ...
    
    } 200>/var/lock/mylockfile
    

    这会在新的 I/O 上下文中运行在锁定下执行的命令,但 不会 启动子 shell。在大括号内,所有执行的命令都会将文件描述符 200 打开到锁定的锁定文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 2014-05-05
      • 2018-02-23
      • 2021-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多