【问题标题】:Bash script not ending because of the background processes由于后台进程,Bash 脚本没有结束
【发布时间】:2021-09-01 11:10:47
【问题描述】:

我有一个如下所示的 bash 脚本:它运行带有不同参数的 python 脚本,每个参数都作为后台进程(注意我使用了 '&')

#!/bin/bash
declare -a arr=("arg1" "arg2" "arg3")
for i in "${arr[@]}"
do
    echo "$i"
    python3 test.py $i &
    echo "hi"
done
exit

test.py文件如下:

import sys
print('Argument List:', str(sys.argv))

我尝试使用命令 ./bash_script_test.sh 运行 bash 脚本。 输出也是正确的,但脚本只是没有结束运行。加上 python 代码的输出从一个新的命令行开始。请参阅下面的输出。

arg1
hi
arg2
hi
arg3
hi
[root@csit-openstack1 risav]# Argument List: ['test.py', 'arg2']
Argument List: ['test.py', 'arg3']
Argument List: ['test.py', 'arg1']

为什么会出现一个新的命令行,为什么 shell 脚本没有退出?是因为使用 & 吗?如果有,谁能解释一下?

【问题讨论】:

  • 您看到“新命令行(提示)”的原因是因为主脚本已经完成并且您看到了命令行(提示); py 输出输出滞后并被转储到终端...在适当的时候;根据前台/后台处理速度,您可以重复运行脚本并查看以不同顺序生成的一些输出行......并且在某些终端中甚至可能在同一行出现乱码;正如您所知道的(根据您的评论 - 下面),在 bash 脚本中添加 wait 将确保脚本真的不会结束......
  • ... 直到后台进程完成,此时您将看到命令行(提示);试试这个……给py代码添加一个睡眠,删除wait,运行你的脚本,一旦你看到命令行(提示)(即bash脚本已经完成)然后运行@987654330 @ ... 你会看到你的ls 输出,然后在某个时候py 输出会出现在你的终端中

标签: bash shell subshell


【解决方案1】:

取一杯红色和一杯绿色,将它们倒入同一个桶中。结果是一团棕色的混乱。您的终端也会发生同样的情况。

你有两个进程,前台进程和后台进程。两者同时写入同一个终端。结果是一团糟。后台进程应该改为写入日志文件。

换行

python3 test.py $i &

python3 test.py $i > $i.log &

为每个后台进程提供自己的日志文件。

如果你想合并不同的来源,你必须使用像Syslog这样的工具。

顺便说一句:脚本正在结束。它在循环中做的最后一件事是打印“hi”。你的输出显示了三倍的“hi”。

【讨论】:

  • 否,脚本不会结束。我刚刚找到了一份工作。我在我的 bash 脚本末尾添加了“等待”,现在它并不混乱,脚本结束了。
  • @Rishmitha 还是乱七八糟的,但是你看不到,因为每个子进程只打印一行。当子进程打印多行时,您会看到它。脚本终止。将下面的trap 'echo I am done.' EXIT 放在exit 前面就可以看到了。如果您不需要处理它们的输出,则无需等待后台进程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多