You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么含&后台进程的Bash脚本无法退出、Python输出出现在新命令行

问题原因说明

你观察到的两个现象都和&符的使用直接相关,具体原理如下:

  1. “脚本无法结束”是视觉误解
    你看到的[root@csit-openstack1 risav]#就是bash脚本执行完毕退出后,父shell弹出的命令提示符,说明脚本已经结束运行,你此时可以直接输入其他命令正常执行。你误以为脚本没退出,是因为后续Python进程的输出打断了命令提示符的视觉连贯性。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 00:36:03