如何让GNU Parallel先执行完cmds1.txt再执行cmds2.txt?
问题分析与解决方案
首先,你不需要使用wait $(jobs -rp),原因很直接:GNU Parallel本身是阻塞式执行的——当你通过管道调用parallel时,它会持续运行直到cmds1.txt中的所有任务全部执行完毕才会退出,管道后续的sshpass进程也会在parallel的输出全部处理完成后结束。也就是说,第一条命令执行完毕时,cmds1.txt的任务已经全部完成,额外的wait语句属于冗余操作,甚至可能因为没有后台进程而抛出错误。
如果你的需求是“先完成cmds1.txt的所有任务,再执行cmds2.txt的任务”,直接按顺序编写两条命令即可实现,不需要额外的等待逻辑:
cat cmds1.txt | parallel -j4 --colsep ' ' -k echo {} | sshpass -p sftp xxx@localhost cat cmds2.txt | parallel -j100 --colsep ' ' -k --bar echo {} | sshpass -p sftp xxx@localhost
补充提示
注意第二条命令中--colsep ' '与-k之间多了一个空格,需要修正为--colsep ' ' -k,避免出现语法错误。只有当parallel被放到后台运行(比如命令末尾加&)时,才需要用wait等待其结束,而你的场景中parallel是前台执行的,管道机制会自动保证前一条命令完成后再执行下一条。
内容的提问来源于stack exchange,提问作者lunbox
相关产品推荐
相关产品推荐

