Shell脚本并行执行出现挂起问题,求排查修正方案
解决Shell脚本并行执行终端挂起的问题
我来帮你拆解下问题根源,然后一步步给出修正方案~
问题所在
你当前的循环代码是串行执行每个脚本:每次都会等fileto_run.sh ${arr[i]}完全跑完,才会进入下一次循环,所以终端会一直挂起直到所有脚本都执行完毕。另外你提到的-bash-x.x$ 1 2是因为如果后来你加了&让脚本后台运行,脚本里的echo输出会和终端的提示符混在一起,看起来像终端卡住,但其实只是输出干扰,并非真的挂起。
修正方案
1. 实现真正的并行执行
给每个脚本命令加上&,让它们在后台独立运行,循环会立刻遍历完所有元素,不会阻塞终端:
declare -a arr=("1" "2") for ((i=0;i<${#arr[@]};++i)); do sh fileto_run.sh ${arr[i]} & done
这样每个脚本都会在后台启动,你可以立刻继续在终端执行其他命令。
2. 避免后台输出干扰终端
如果脚本里有echo这类输出,后台进程的打印会和终端提示符混在一起,看着很混乱。可以把每个脚本的输出重定向到单独的日志文件:
declare -a arr=("1" "2") for ((i=0;i<${#arr[@]};++i)); do # 将标准输出和错误输出都写入对应日志文件 sh fileto_run.sh ${arr[i]} > "script_${arr[i]}.log" 2>&1 & done
之后你可以通过cat script_1.log这类命令查看每个脚本的执行日志。
3. 等待所有后台脚本执行完毕(可选)
如果后续有依赖这些脚本执行结果的操作,可以在循环结束后加上wait命令,它会等待所有后台子进程完成后再继续:
declare -a arr=("1" "2") for ((i=0;i<${#arr[@]};++i)); do sh fileto_run.sh ${arr[i]} > "script_${arr[i]}.log" 2>&1 & done # 等待所有后台脚本执行完成 wait echo "所有并行脚本已执行完毕!"
补充说明
- 你之前尝试的
break语句没用,是因为break只是终止循环,并没有解决脚本串行执行导致终端挂起的问题。 - 如果加了
&后出现输出和提示符混在一起的情况,不需要按Ctrl+C,直接按回车就能回到正常的终端提示符状态。
内容的提问来源于stack exchange,提问作者sk7979
相关产品推荐
相关产品推荐

