我有一些并行运行的压力测试脚本,它们会在完成后挂起并等待 RETURN 按键退出。经过调查,我发现这并不是我的脚本所特有的,而是在 bash 上运行的各种脚本所特有的,并且它取决于生成的输出的大小(至少在我的系统中:Ubuntu 精确)
例如以下内容:
find . &
如果产生了足够的输出(尝试 .. 或 ../.. 以获得更多输出),则挂起并等待 RETURN 击键,否则(即,如果产生“少量”输出)则退出而不挂起。
由于我发现这种功能在我的特定情况下很烦人,有没有办法解决它?
答案1
该命令不会挂起。您认为该命令已挂起,因为您没有看到提示。提示就在那里。您看不到提示,因为它是由后台进程的输出推送的。在后台进程的长输出后按 Enter 键会导致 shell“执行”空行并打印新的提示符。
尝试以下方法来说服自己:
- 执行
find . &
- 等待输出完成
- 看到闪烁的光标或其他东西但没有提示
- 类型
echo foo
- 按回车键
- 查看
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进程之间。