tail
не блокирует
Как всегда: для всего есть ответ, который короток, прост для понимания, легок для понимания и совершенно неверен. Вот tail -f /dev/null
попадает в эту категорию;)
Если вы посмотрите на это вместе, strace tail -f /dev/null
вы заметите, что это решение далеко не блокирует! Вероятно, это даже хуже, чем sleep
решение в вопросе, поскольку он использует (под Linux) драгоценные ресурсы, такие как inotify
система. Также другие процессы, которые пишут, чтобы /dev/null
сделать tail
цикл. (На моем Ubuntu64 16.10 это добавляет несколько 10 системных вызовов в секунду в уже загруженной системе.)
Вопрос был для команды блокировки
К сожалению, нет такой вещи ..
Читайте: я не знаю, как архивировать это с помощью оболочки напрямую.
Все (даже sleep infinity
) может быть прервано каким-то сигналом. Поэтому, если вы хотите быть действительно уверенным, что он не исключительно возвращается, он должен работать в цикле, как вы уже сделали для своего sleep
. Обратите внимание, что (в Linux), по- /bin/sleep
видимому, ограничено 24 днями (посмотрите strace sleep infinity
), поэтому лучшее, что вы можете сделать, это:
while :; do sleep 2073600; done
(Обратите внимание, что я считаю, что sleep
циклы внутренне для более высоких значений, чем 24 дня, но это означает: это не блокирование, а очень медленное зацикливание. Так почему бы не переместить этот цикл наружу?)
.. но вы можете подойти довольно близко с неназванным fifo
Вы можете создать что-то, что действительно блокирует, пока нет никаких сигналов, посылаемых процессу. Следующее использование bash 4
, 2 PID и 1 fifo
:
bash -c 'coproc { exec >&-; read; }; eval exec "${COPROC[0]}<&-"; wait'
Вы можете проверить, что это действительно блокирует, strace
если вам нравится:
strace -ff bash -c '..see above..'
Как это было построено
read
блокирует, если нет входных данных (см. некоторые другие ответы). Однако tty
(aka. stdin
) Обычно не является хорошим источником, так как он закрывается, когда пользователь выходит из системы. Также это может украсть некоторый вклад от tty
. Не хорошо.
Чтобы сделать read
блок, нам нужно ждать чего-то вроде a, fifo
которое никогда ничего не вернет. В bash 4
есть команда , которая может точно предоставить нам такие fifo
: coproc
. Если мы также ждем блокировку read
(которая является нашей coproc
), мы сделали. К сожалению, для этого необходимо оставить открытыми два идентификатора PID и a fifo
.
Вариант с именем fifo
Если вы не удосужились использовать именованные fifo
, вы можете сделать это следующим образом:
mkfifo "$HOME/.pause.fifo" 2>/dev/null; read <"$HOME/.pause.fifo"
Не использовать цикл при чтении немного небрежно, но вы можете использовать его fifo
так часто, как вам нравится, и заставить его read
завершить с помощью touch "$HOME/.pause.fifo"
(если имеется более одного ожидания чтения, все завершаются одновременно).
Или используйте pause()
системный вызов Linux
Для бесконечной блокировки есть вызов ядра Linux, который называется pause()
, который делает то, что мы хотим: ждать вечно (пока не придет сигнал). Однако для этого пока нет программы для пользователя.
С
Создать такую программу легко. Вот фрагмент кода для создания очень маленькой программы для Linux, которая называется на pause
неопределенный срок (нужды diet
и gcc
т. Д.):
printf '#include <unistd.h>\nint main(){for(;;)pause();}' > pause.c;
diet -Os cc pause.c -o pause;
strip -s pause;
ls -al pause
python
Если вы не хотите что-то компилировать самостоятельно, но уже python
установили, вы можете использовать это под Linux:
python -c 'while 1: import ctypes; ctypes.CDLL(None).pause()'
(Примечание: использовать exec python -c ...
для замены текущей оболочки, это освобождает один PID. Решение может быть улучшено также путем некоторого перенаправления ввода-вывода, освобождая неиспользуемые FD. Это ваше дело.)
Как это работает (я думаю): ctypes.CDLL(None)
загружает стандартную библиотеку C и запускает в ней pause()
функцию в каком-то дополнительном цикле. Менее эффективен, чем версия C, но работает.
Моя рекомендация для вас:
Оставайтесь в дремлющем сне. Это легко понять, очень переносимо и блокирует большую часть времени.