我看到已经讨论了几次如何不并发地运行脚本,但我还没有看到并发写的主题。
我正在使用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,但我不确定哪种最适合我的情况,我正在寻求建议/建议。
谢谢,罗伯托
发布于 2014-07-07 04:42:22
我将使用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并行,而不是另一个并行,并且/etc/ and /config为空。
发布于 2014-07-07 05:45:44
我认为这最终完成了工作。循环会一直运行,直到脚本的这个实例能够锁定日志文件为止。然后对其进行写入和解锁。
并行运行的脚本的其他实例可能正在尝试写入,它们将找到锁...或者将能够为自己锁定该文件。
while [ -! `lockfile -1 log.lock` ]; do
echo -e "accessing file at "`date`
echo -e "$logblock" >> log
rm -f log.lock
break
done有没有人看到这种解决方案的缺点?
https://stackoverflow.com/questions/24594680
复制相似问题