需要深入解释如何在Linux shell脚本中使用flock吗

需要深入解释如何在Linux shell脚本中使用flock吗,linux,bash,shell,locking,Linux,Bash,Shell,Locking,我正在研究一个小的树莓Pi集群(4个Pi)。我有3个Raspberry Pi节点,它们将在Pi头部的message.txt文件中留下一条消息。头部Pi将在一个循环中检查message.txt文件以查看是否有行。当它发生时,我想锁定文件,然后提取我需要的信息。我遇到的问题是,我需要执行多个命令。我发现允许多个命令的唯一方法如下所示 ( flock -s 200 # ... commands executed under lock ... ) 200>/var/lock/mylockfil

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

(
flock -s 200

# ... commands executed under lock ...

) 200>/var/lock/mylockfile 
这种方法的问题在于它使用了一个子外壳。问题是,我有“作业”文件,标签为job_1 job_2等。。。。。我希望能够使用计数器。如果我将计数器的增量放在子shell中,它将只在子shell的范围内考虑。如果我拉出递增,那么在我递增计数器并锁定文件之前,另一个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
#现在进入循环发送工作,因为PI要求更多工作
而[$jobsLeftCount-gt 0]
做
echo“launchJobs.sh:即将检查消息文件”
msgLines=$(wc-l<$msgLocation)
如果[$msgLines];然后
#找到锁定文件的方法并在此处执行
echo“launchJobs.sh:找到邮件。锁定邮件文件以读取内容”
(
flock-e 350
回显“收到消息”
边读边做
#重命名要发送到节点“作业”的文件
mv$jobLocation$jobName$jobsLeftCount/home/pi/algo2/Jobs/job
#将新作业转移到每个留下消息的脚本
scp/home/pi/algo2/Jobs/jobpi@192.168.0.$line:/home/pi/algo2/Jobs/
jobsLeftCount=$jobsLeftCount-1;
回音$线
完成<$msgLocation
#清除消息文件
>$msgLocation
#在此处解锁MESG文件
)350>$msgLocation
echo“头节点剩余$jobsLeftCount”
fi
#jobsLeftCount=$jobsLeftCount-1;
#echo“这是$jobsLeftCount文件”
完成

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

{
flock -s 200

# ... commands executed under lock ...

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