【发布时间】:2015-09-30 05:19:41
【问题描述】:
我有一个简单的脚本,它从一系列硬盘驱动器中提取 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
由于这需要几秒钟才能运行,我想找到一种方法来并行化它。我尝试在循环中的单行末尾附加一个“&”,但这会导致文本文件在部分完成时随意写入,而不是按顺序和以可读的方式写入。有没有办法将其分叉为每个驱动器的单独进程,然后将输出通过管道传输回有序的文本文件?
另外,我假设设置文件名变量必须移动到 for 循环中,以便 fork 能够访问它。但是,如果脚本运行的时间足够长以滚动到新的一分钟(或两分钟),然后脚本变成顺序带日期戳的片段而不是一个连续的文件,则会导致问题。
【问题讨论】:
-
我假设您可以启动一个新的 bash 并将其置于后台?哦,我明白了,问题出在生成的文件中被乱码。将结果捕获到数组或不同命名的变量中,等待所有子项并在所有操作完成后按所需顺序复制变量。
-
我不确定你的意思.... 该脚本会在网络连接成功后自动运行,以在远程 ftp 服务器上存档创建的日志文件。
-
我也试过了(允许每个分叉的进程生成自己的临时文件,然后在归档之前将它们全部连接到一个主文件中)但是实际上运行速度比简单地执行 for 循环慢,因为写入一个驱动器一次。
-
当
a b c ...更短且 100% 可移植时,{a,b,c,...}的意义何在?不要编写 bash 脚本。编写 shell 脚本。 -
@Jens 是的,我确信总会有办法编写更短的脚本,但是问题是关于 bash 中的 for 循环,因为它是已经编写的更大脚本的一部分......等待它... bash。 :D
标签: bash for-loop parallel-processing