我有一个简单的脚本,该脚本从一系列硬盘驱动器中提取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循环中,以便派生程序能够访问它。但是,如果脚本运行了足够长的时间以滚动到新的一分钟(或两分钟),然后脚本变成了按顺序标注日期的片段,而不是一个连续的文件,则会引起问题。
使用这样的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
选项keeps
按顺序输出。-j 8
如果要一次运行8个,请添加,否则一次将每个内核运行一次。或者,-j 16
如果您想一次运行它们全部...
parallel -j 16 -k 'smartctl ....
当然,如果您在,bash
也可以这样做:
parallel -j 16 -k 'smartctl -a /dev/{}' ::: {a..o} > path/to/output
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句