首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并行计算日志,如何防止交叉写入?flock文件还是flock?

并行计算日志,如何防止交叉写入?flock文件还是flock?
EN

Stack Overflow用户
提问于 2014-07-06 18:00:39
回答 2查看 1.1K关注 0票数 2

我看到已经讨论了几次如何不并发地运行脚本,但我还没有看到并发写的主题。

我正在使用xargs执行一些并行计算,并启动用于实际计算的命令。在每次计算结束时,我希望该进程访问一个文件,并将结果放入其中。我遇到了麻烦,因为对日志文件的写入是以每个进程可以同时访问日志文件的方式发生的,导致交错条目,其中一行来自一次运行,另一行来自另一次运行,几乎在同一时间完成(由于xargs运行的并行性,很可能会发生这种情况)。

因此,在实践中,假设我使用xargs并行运行一个脚本的几个组成部分,该脚本如下所示:

代码语言:javascript
复制
#!/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

目前,我得到的输出文件与交错运行日志如下

代码语言:javascript
复制
<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,但我不确定哪种最适合我的情况,我正在寻求建议/建议。

谢谢,罗伯托

EN

回答 2

Stack Overflow用户

发布于 2014-07-07 04:42:22

我将使用traceroute作为示例,因为它打印输出很慢,但任何其他命令也可以工作。比较:

代码语言:javascript
复制
(echo 8.8.8.8;echo 8.8.4.4) | xargs -P6 -n1 traceroute > traceroute.xarg

至:

代码语言:javascript
复制
(echo 8.8.8.8;echo 8.8.4.4) | parallel traceroute > traceroute.para

确保您安装的是GNU并行,而不是另一个并行,并且/etc/ and /config为空。

票数 0
EN

Stack Overflow用户

发布于 2014-07-07 05:45:44

我认为这最终完成了工作。循环会一直运行,直到脚本的这个实例能够锁定日志文件为止。然后对其进行写入和解锁。

并行运行的脚本的其他实例可能正在尝试写入,它们将找到锁...或者将能够为自己锁定该文件。

代码语言:javascript
复制
while [ -! `lockfile -1 log.lock` ]; do
 echo -e "accessing file at "`date`
 echo -e "$logblock"  >> log
 rm -f log.lock
 break    
done

有没有人看到这种解决方案的缺点?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24594680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档