【发布时间】:2021-09-13 12:52:21
【问题描述】:
在我的 bash 脚本开始时,我禁止脚本在遇到错误时停止(因为我希望我的脚本在这种情况下继续执行):
set +e
然后我将程序作为作业运行,运行一些中间命令,然后将作业带回前台。我实际上是在一个循环中执行此操作,以便在发生任何错误时程序不断重新启动。
set -m # enable job control
while :
do
./my_program &
export BOT_PID=$!
export BOT_JID=$(jobs -l | grep -oP "\[\K[0-9]+(?=\]. $BOT_PID)")
# ... some intermediary commands
fg $BOT_JID
test $? -gt 128 && break
done
我的程序崩溃了,这很好,但由于某种原因,这导致脚本停止运行,并让我重新获得对运行 shell 脚本的终端的控制权。
上面的line 16指的是fg命令。
我不知道如何解决这个问题。当我的程序崩溃时,shell 脚本应该继续运行。
有什么想法吗?
【问题讨论】:
-
你的程序在循环后是否退出,
./my_program崩溃时$?的值是多少? -
一般来说,在脚本中,你应该使用
wait,而不是fg。没有充分的理由在脚本中打开作业控制;有更好的工具来管理不需要它的后台进程,并且没有它的限制(并且专注于人类/交互式使用)。 -
另外,存储后台进程的 PID。
./my_program & my_program_pid=$!,然后是wait "$my_program_pid" -
大于 128,因此会中断循环。
-
或者,更好的是
my_program_rc=0; wait "$my_program_pid" || my_program_rc=$?——这样你就可以收集退出状态并将wait标记为“已检查”,这样就不会出现错误致命 即使set -e已启用。
标签: bash error-handling jobs