【问题标题】:log of parallel computations, how do I prevent interleaved write? lockfile or flock?并行计算日志,如何防止交错写入?锁定文件或羊群?
【发布时间】:2014-08-26 23:54:36
【问题描述】:

我看到已经讨论过好几次如何不并发运行脚本了,但是我没有看到并发写入的话题。

我正在使用 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,但我不确定什么最适合我的情况,我正在寻求建议/建议。

谢谢, 罗伯托

【问题讨论】:

  • 让每个脚本写入自己的日志文件并在所有处理完成后将它们连接起来可能是一个更简单的解决方案。我们是否应该假设这不是您的方案中的一个选项?
  • 您好 Arnauld,感谢您的意见。这也是我一段时间的想法。但是,如果可能的话,我想避免它,以便能够在“构建”时查看日志。
  • 看看savannah.gnu.org/projects/parallel,也许这可以帮助您解决问题:youtu.be/P40akGWJ_gY from 1:00 (Group Output)。
  • @Roberto:我明白了。但是,如果您想在构建期间进行“人工”检查,则类似“watch tail *.log”之类的内容可能会为每个工作脚本提供方便的视图。
  • @Cyrus 我们的集群默认没有parallel,我问过是否可以安装它,但是没有的事实让我怀疑我是否想接受它。我希望有一些可以在任何地方运行的东西,而 xargs 似乎可以为并行化完成这项工作。由于问题仅出现在日志记录级别,因此最好为日志找到解决方法并仍然使用 xargs。除了那个平行看起来很有趣!我已经在我的 Mac 上安装(酿造)了一些测试!

标签: bash parallel-processing locking xargs


【解决方案1】:

我将使用 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 是空的。

【讨论】:

  • 这与赛勒斯通过 youtube 链接建议的内容有什么不同吗?
【解决方案2】:

我认为这最终可以完成工作。循环继续进行,直到脚本的这个实例可以为自己锁定日志文件。然后写入并解锁。

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

while [ -! `lockfile -1 log.lock` ]; do
 echo -e "accessing file at "`date`
 echo -e "$logblock"  >> log
 rm -f log.lock
 break    
done

有人看到这种解决方案有什么缺点吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多