gpt4 book ai didi

bash - 有没有办法并行化 bash for 循环?

转载 作者:行者123 更新时间:2023-11-29 09:27:46 25 4
gpt4 key购买 nike

我有一个简单的脚本,可以从一系列硬盘驱动器中提取 SMART 数据,并将其写入带有时间戳的日志文件,该文件稍后会被记录并解析相关数据。

filename="filename$( date '+%Y_%m_%d_%H%M' ).txt"
for i in {a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p}
do
smartctl -a /dev/sd$i >> /path/to/location/$filename
done

由于这需要几秒钟才能运行,我想找到一种方法来并行化它。我试过在循环中的单行末尾附加一个“&”,但这会导致文本文件在部分结束时随意写入,而不是按顺序和可读的方式写入。有没有办法将其 fork 到每个驱动器的单独进程中,然后将输出通过管道传输回有序的文本文件?

此外,我假设必须将设置文件名变量移到 for 循环中,以便 fork 能够访问它。但是,如果脚本运行的时间足够长以滚动到新的一分钟(或两分钟),然后脚本变成按顺序标记日期戳的片段而不是一个连续的文件,这会导致问题。

最佳答案

像这样使用 GNU Parallel:

parallel -k 'smartctl -a /dev/{}' ::: a b c d e f g h  i j k l m n o p > path/to/output

-k 选项保持输出顺序。如果您想一次运行 8 个,请添加 -j 8,否则它将一次每个内核一个。或者 -j 16 如果你想一次运行它们...

parallel -j 16 -k 'smartctl ....

当然,如果您在 bash 中,您也可以这样做:

parallel -j 16 -k 'smartctl -a /dev/{}' ::: {a..o} > path/to/output

关于bash - 有没有办法并行化 bash for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32858342/

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