为什么后台作业会根据输出的大小而挂起?

为什么后台作业会根据输出的大小而挂起?

我有一些并行运行的压力测试脚本,它们会在完成后挂起并等待 RETURN 按键退出。经过调查,我发现这并不是我的脚本所特有的,而是在 bash 上运行的各种脚本所特有的,并且它取决于生成的输出的大小(至少在我的系统中:Ubuntu 精确)

例如以下内容:

find . &

如果产生了足够的输出(尝试 .. 或 ../.. 以获得更多输出),则挂起并等待 RETURN 击键,否则(即,如果产生“少量”输出)则退出而不挂起。

由于我发现这种功能在我的特定情况下很烦人,有没有办法解决它?

答案1

该命令不会挂起。您认为该命令已挂起,因为您没有看到提示。提示就在那里。您看不到提示,因为它是由后台进程的输出推送的。在后台进程的长输出后按 Enter 键会导致 shell“执行”空行并打印新的提示符。

尝试以下方法来说服自己:

  1. 执行find . &
  2. 等待输出完成
  3. 看到闪烁的光标或其他东西但没有提示
  4. 类型echo foo
  5. 按回车键
  6. 查看foo打印的内容和新的提示

更多实验:

seq 10 &

这将打印数字 1 到 10,然后打印提示。

seq 10000 &

这将打印数字 1 到 10000,然后光标闪烁并且没有提示。但提示是有的。尝试echo foo按 Enter 键,您将看到foo打印的内容和新的提示。

(sleep 2; seq 10) &

该命令模拟具有长输出但不具有长输出的命令的等待时间。在我的系统上,这会产生以下效果:firstsleep 2在后台执行。片刻之后,shell 会打印提示符。然后,2秒后,seq 10在后台执行。这将打印十行并将提示向上推。然后后台工作就完成了。

所以你会看到后台作业总是完成,并且总是有提示,只是你并不总是看到提示。当后台作业快速完成时,shell 将在最后打印提示,您将看到该提示。当后台作业需要一段时间打印它的输出时,shell 已经打印了一个提示,但该提示被推高,因此您不再看到它。

更多实验:

尝试seq 10000 &或任何其他大数字,您在输出末尾看不到提示。现在尝试这个数字的一​​半。在这个例子中seq 5000 &。您看到提示了吗?如果您这样做,请尝试更大的数字。例如seq 7500 &。如果您没有看到提示,请尝试较小的数字。例如seq 2500 &。继续执行此操作,直到您看到提示仅被推了几行为止。每个运行的数字都会有所不同,因为我们这里实际上是一个竞争条件后台进程和shell进程之间。

相关内容