我看到已经多次讨论过如何不同时运行脚本,但我没有看到并发写主题。
我正在进行一些并行计算,xargs启动实际计算的命令。在每次计算结束时,我希望该进程访问文件并将结果放在那里。我遇到了麻烦,因为日志文件上的写入发生的方式是每个进程可以同时访问日志文件,导致交错条目一次运行一行,另一行运行大约同一时间完成(由于与xargs运行的并行性质,很可能会发生这种情况。)
所以在实践中让我们说使用xargs并行运行脚本的几个例子:
#!/bin/bash
#### do something that takes some time
#### define content of the log
folder="<folder>"$PWD"</folder>\n"
datetag="<enddate>"`date`"</enddate>\n"
#### store log in XML ####
echo -e "<myrun>\n""$folder""$datetag""</myrun>" >> $outputfie
目前我得到的输出文件包含这样的交错运行日志
<myrun>
<myrun>
<folder>./generations/test/run1</folder>
<folder>./generations/test/run2</folder>
<enddate>Sun Jul 6 11:17:58 CEST 2014</enddate>
</myrun>
<enddate>Sun Jul 6 11:17:58 CEST 2014</enddate>
</myrun>
有没有办法一次给一个脚本实例提供“独占访问权限”,这样每个脚本都可以写入日志而不会干扰其他脚本?
我见过flock和lockfile,但我不确定什么最符合我的情况,我正在寻求建议/建议。
谢谢, 罗伯特
答案 0 :(得分:0)
我将使用traceroute作为示例缓慢打印输出,但任何其他命令也可以。比较:
(echo 8.8.8.8;echo 8.8.4.4) | xargs -P6 -n1 traceroute > traceroute.xarg
为:
(echo 8.8.8.8;echo 8.8.4.4) | parallel traceroute > traceroute.para
确保安装GNU Parallel而不是另一个并行,并且/ etc / parallel / config为空。
答案 1 :(得分:0)
我认为这最终能完成这项工作。循环继续运行,直到此脚本实例可以锁定自己的日志文件。然后写入并解锁它。
并行运行并且可能尝试写入的脚本的其他实例将找到锁定...或者能够自己锁定文件。
while [ -! `lockfile -1 log.lock` ]; do
echo -e "accessing file at "`date`
echo -e "$logblock" >> log
rm -f log.lock
break
done
有没有人看到这种解决方案有任何缺点?