gpt4 book ai didi

bash - 并行计算日志,如何防止交错写入? lockfile 还是 flock?

转载 作者:行者123 更新时间:2023-12-05 06:45:21 25 4
gpt4 key购买 nike

我看到已经讨论过多次如何不并发运行脚本,但我没有看到并发写入的主题。

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

谢谢,罗伯托

最佳答案

我将使用 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 而不是另一个 parallel,并且/etc/parallel/config 是空的。

关于bash - 并行计算日志,如何防止交错写入? lockfile 还是 flock?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24594680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com