如何用Bash for循环实现并行处理并捕获步骤完成时间
解决后台进程完成后打印结束时间的问题
你的核心问题是:将耗时的process 3放入后台后,需要在它实际完成时打印结束时间,同时不阻塞循环处理下一个文件。原脚本里的echo会在process 3启动后立刻执行,所以无法满足需求。
修正后的脚本
f_list='a b c d' for f in $f_list do echo "start process 1 for ${f}" # 替换为你的process1代码 echo "start process 2 for ${f}" # 替换为你的process2代码 echo "start process 3 for ${f} at $(date)" # 将process3和结束时间打印绑定为一个后台任务 { # 替换为你的process3代码 code to start process 3 echo "process 3 done for ${f} at $(date)" } & done # 可选:等待所有后台process3任务全部完成后再结束脚本 wait echo "All files processed"
原理说明
- 用
{ ... } &把process3和后续的echo包裹成一个整体后台任务:循环会在启动这个后台块后,立刻继续处理下一个文件,不会等待process3完成。 - 后台块内部,
process3执行完毕后,才会执行echo打印结束时间,保证时间是任务完成的真实时间。 - 末尾的
wait是可选的,如果需要脚本等所有后台process3都做完再退出,就加上;如果不需要,去掉即可。
内容的提问来源于stack exchange,提问作者cookiemonster
相关产品推荐
相关产品推荐

