Это может показаться тривиальным, но я уверен, что этот вопрос не задан, или, по крайней мере, я не могу его найти.
Я ищу способ построения бесконечного ожидания (не обязательно цикла) с помощью сценариев оболочки, чтобы он ожидал навсегда и может быть убит (или технически, чтобы получить SIGTERM
). Ниже приведены возможные конструктивные и аргументированные аргументы:
-
while true; do sleep 1; done
Это почти получается, но посколькуsleep
- внешняя команда, когда я отправляюSIGTERM
на запущенный script, он должен дождаться завершенияsleep
, а затем обработать сигнал. Изменитеsleep 1
на что-то вродеsleep 10
, и отставание будет очевидно. Также решение пробуждает процессор каждые 1 секунду, что не идеально. -
while true; do read; done
Это идеально, когдаstdin
есть tty.read
- это встроенная оболочка, аSIGTERM
мгновенно появляется в script. Но, когдаstdin
является/dev/null
, script использует весь процессор, беспомощно запускаяread
навсегда на/dev/null
.
Таким образом, требуется встроенная конструкция оболочки, которая ждет вас навсегда. Прокрутка через man dash
Я не нашел такого - единственные блокирующие встроенные элементы read
и wait
, и у меня нет идеи, как я могу построить идеальный с помощью wait
.
Ответ должен быть применим к оболочке POSIX (эффективно dash
) или менее предпочтительно Bash.
Дополнительные примечания.
Ситуация, когда первый пример не работает отлично, сложнее, чем я думал. Со следующей оболочкой script:
#!/bin/sh
echo $$
while true; do
sleep 100
done
если вы убьете его на другом tty, он немедленно прекратится. Самое смешное начинается, когда вы пытаетесь поймать ловушку. С помощью этого script:
#!/bin/sh
at_term() {
echo 'Terminated.'
exit 0
}
trap at_term TERM
echo $$
while true; do
sleep 20
done
То, что происходит, точно описано в примере 1. Это происходит с bash, тире и zsh. И при этом условии, что я ищу "идеальную" конструкцию бесконечного взгляда.