为什么含&后台进程的Bash脚本无法退出、Python输出出现在新命令行
问题原因说明
你观察到的两个现象都和&符的使用直接相关,具体原理如下:
- “脚本无法结束”是视觉误解
你看到的[root@csit-openstack1 risav]#就是bash脚本执行完毕退出后,父shell弹出的命令提示符,说明脚本已经结束运行,你此时可以直接输入其他命令正常执行。你误以为脚本没退出,是因为后续Python进程的输出打断了命令提示符的视觉连贯性。 - Python输出出现在命令行提示符后是异步执行导致的
&符的作用是把命令放到后台进程组执行,父进程(即你的bash脚本)不会等待该命令执行完成,会直接往下走后续逻辑。你的bash脚本本身逻辑非常简单,循环三次启动后台进程后就执行exit退出,整个过程毫秒级就能跑完。
但被你放到后台的三个Python进程是独立运行的,不会随父脚本退出而终止,它们的标准输出/标准错误默认继承了当前终端的文件描述符。等Python进程执行到print逻辑时,终端已经弹出了新的命令提示符,输出内容就会直接打印在提示符后方。
修复方案
如果要避免该现象,只需要在bash脚本循环结束后、exit前添加wait命令,让父脚本等待所有后台子进程执行完毕再退出即可,修改后脚本如下:
#!/bin/bash declare -a arr=("arg1" "arg2" "arg3") for i in "${arr[@]}" do echo "$i" python3 test.py $i & echo "hi" done wait # 新增等待所有后台进程结束的逻辑 exit
如果不需要保留Python进程的输出,也可以在启动时重定向输出,避免内容打印到终端:
python3 test.py $i > /dev/null 2>&1 &
内容的提问来源于stack exchange,提问作者techtie
相关产品推荐
相关产品推荐

