почему фоновые задания зависают в зависимости от размера вывода?

Фигурные скобки являются расширением оболочки, таким образом, можно использовать их с любой командой. Для записи это не должно быть .., и это не должны быть буквы. Числа работают с диапазоном, можно использовать запятые для независимых значений, и можно смешать его с регулярными маркерами или другими расширениями:

$ echo {1..3} {a..c} {1..3}-{a,c}
1 2 3 a b c 1-a 1-c 2-a 2-c 3-a 3-c

И можно вложить, который я часто использую для установки/удаления ({,un}installing :)) пакеты.

aptitude install package{,-{dev,doc}}

который расширяется до

package package-dev package-doc
4
14.03.2013, 20:08
1 ответ

Команда не зависает. Вы думаете, что команда зависает, потому что Вы не видите подсказку. Подсказка там. Вы не видите подсказку, потому что она была увеличена выводом фонового процесса. При нажатии Enter после того, как долгий вывод фонового процесса заставляет оболочку "выполнять" пустую строку и печатать новую подсказку.

Попробуйте следующее для убеждения себя:

  1. выполниться find . &
  2. ожидать, пока не произведено не сделано
  3. посмотрите мерцающий курсор или что-то ни кроме какой подсказки
  4. ввести echo foo
  5. нажмите Enter
  6. посмотрите foo распечатанный и новая подсказка

Больше экспериментов:

seq 10 &

это распечатает номера 1 - 10 и затем распечатает подсказку.

seq 10000 &

это распечатает номера 1 - 10 000, и затем у Вас есть мерцающий курсор и никакая подсказка. Но подсказка там. попробовать echo foo и нажмите Enter, и Ваш будет видеть foo распечатанный и новая подсказка.

(sleep 2; seq 10) &

эта команда эмулирует время ожидания команды с долгим выводом, но не имеет долгого вывода. В моей системе это имеет следующий эффект: сначала sleep 2 выполняется в фоновом режиме. несколько моментов спустя оболочка печатает подсказку. затем, после 2 секунд, seq 10 выполняется в фоновом режиме. это распечатает десять строк и увеличит подсказку. затем фоновое задание сделано.

Таким образом, Вы видите, что фоновое задание всегда заканчивается, и у Вас всегда есть подсказка, Вы просто не всегда видите подсказку. Когда фоновое задание сделано быстро затем, оболочка печатает подсказку в конце, и Вы видите подсказку. Когда фоновое задание требует времени, печатая, оно производится затем, оболочка уже распечатала подсказку, но что подсказка увеличена так, Вы больше не видите его.

Еще больше экспериментов:

Попробовать seq 10000 & или любое другое большое количество, где Вы не видите подсказку в конце ouput. Теперь попробуйте половину того числа. В этом примере seq 5000 &. Вы видите подсказку? Если Вы действительно затем пробуете большее число. Например, seq 7500 &. Если Вы не видите, что подсказка затем пробует меньшее число. Например, seq 2500 &. Продолжайте делать это, пока у Вас нет числа, где Вы видите, что подсказка увеличила всего несколько строк. Число будет варьироваться от выполненного для выполнения, потому что, что мы имеем вот, практически состояние состязания между фоновым процессом и процессом оболочки.

15
27.01.2020, 20:46
  • 1
    Любопытно достаточно, даже 'seq 10&' в моей системе печатает подсказку перед 1-й строкой вывода каждый раз. Можно также продемонстрировать это при помощи клавиш управления курсором для отзыва команды. Это работает даже при том, что нет никакой очевидной подсказки. –  SuperMagic 12.03.2013, 21:20

Теги

Похожие вопросы