繁体   English   中英

需要深入说明如何在Linux Shell脚本中使用flock

[英]Need an in-depth explanation of how to use flock in Linux shell scripting

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

(
flock -s 200

# ... commands executed under lock ...

) 200>/var/lock/mylockfile 

这种方法的问题在于它使用了一个子外壳。 问题在于我有一个标签为job_1 job_2 etc .....的“ job”文件,希望可以与它一起使用。 如果我将计数器的增量放在子外壳中,则只会在子外壳的范围内考虑。 如果我拉出增量,则在增加计数器并锁定文件之前,另一个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

如果子外壳环境不可接受,请使用括号代替括号来对命令进行分组

{
flock -s 200

# ... commands executed under lock ...

} 200>/var/lock/mylockfile

这将运行在一个新的I / O环境下锁定执行的命令,但启动一个子shell。 在大括号内,所有执行的命令将向锁定的锁定文件打开文件描述符200。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM