【问题标题】:bash shell script terminates after program execution in loopbash shell 脚本在程序循环执行后终止
【发布时间】:2015-04-07 09:33:52
【问题描述】:

下面的简化(printf/echo/cd/sleep/progressbar 命令,忽略不计) bash shell 脚本在第一次执行二进制文件后终止。为什么是这样?我可以在不修改二进制文件本身的情况下做或测试任何事情(只能在一定程度上做到这一点)?

PROGRESS=0
SIMULATIONS=30

for number in $(seq ${PROGRESS} ${SIMULATIONS})
  do
  echo 'INB4 TERMINATION'
  nohup ./binary -someflag
  # do other stuff next
  echo 'NEVER GETS HERE'
done

我已经阅读了traps,但添加了这一行:

trap "echo 'trap invoked'; exit" SIGHUP SIGINT SIGTERM
  • 似乎不起作用。
  • 是否使用nohup 似乎并不重要。
  • 没有二进制命令,循环也能正常工作。

二进制文件的作用

它运行一个 3D 机器人模拟实验(它本身分叉一次以并行运行 2 个机器人模拟器进程(使用 C/C++ system() 命令)。此外,每个机器人模拟器为 16 个机器人控制器中的每一个启动一个线程)。所以二进制是32个线程的父进程。如果这完全有道理,那有关系吗?

【问题讨论】:

  • 脚本是否按预期启动二进制文件? (至少是第一次?)
  • 是的,确实如此,抱歉忘记添加了。二进制文件不会抛出任何错误,并且(可能)以退出状态 0 结束。我认为我无法检查退出状态,因为我的脚本随后立即退出,或者我应该能够吗?
  • 您可以尝试在调用脚本后立即添加内联 echo $? 以检查退出状态:nohup ./binary -someflag; echo $?
  • @MichaelTrouw script quits 表示会再次显示提示?
  • 您正在使用 nohup 但没有在后台运行它?试试command &。除非您计划中途退出脚本并让二进制文件运行,否则不需要nohupAlso,无论出于何种原因,您的脚本无法继续执行,看起来二进制文件从未完成。要检查二进制文件的实际完成情况,您可以使用./binary && echo finished。如果它没有在您的屏幕上打印完成,那么它没有。

标签: macos bash shell


【解决方案1】:

我刚刚发现是什么原因造成的。我从某处提取了一个进度条 bash 函数,并在 ./binary 之后调用了该函数。这导致我的脚本停止......我只是不认为这是之前的原因,因为它没有输出任何东西。这是一个愚蠢的假设。

为了完整起见,这是我使用的进度条: https://github.com/fearside/ProgressBar/

【讨论】:

  • 这就是为什么构建 MCVE (stackoverflow.com/help/mcve) 很重要的部分原因——如果您已经完成了构建和测试的步骤来证明错误并且不包含外部依赖项(所以其他人们可以运行它并亲自查看问题 - 并且包含该行为所需的最低限度),该过程将天生就表明问题出在哪里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 2018-09-06
  • 2011-09-15
相关资源
最近更新 更多