Это может показаться тривиальным, но я уверен, что этот вопрос не задан, или, по крайней мере, я не могу его найти.
Я ищу способ построения бесконечного ожидания (не обязательно цикла) с помощью сценариев оболочки, чтобы он ожидал навсегда и может быть убит (или технически, чтобы получить 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. И при этом условии, что я ищу "идеальную" конструкцию бесконечного взгляда.