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, но работает.
Моя рекомендация для вас:
Оставайтесь в дремлющем сне. Это легко понять, очень переносимо и блокирует большую часть времени.