【问题标题】:Why is bash script stopping after error from foreground job?为什么 bash 脚本在前台作业出错后停止?
【发布时间】: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


【解决方案1】:

我似乎已经通过删除以下行来修复它:

test $? -gt 128 && break

而是将上面的行添加到循环的顶部:

trap "exit 0" SIGINT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 2020-03-09
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多