【发布时间】: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
【问题讨论】: