Назад | Перейти на главную страницу

Bash однострочный, который показывает текущий обратный отсчет до обновления DNS (истечение TTL)

Мне часто приходится обновлять записи DNS, и мне нужно точно знать, когда начнется обновление (также известное как истечение срока TTL). Я придумал этот однострочник bash, который дает мне желаемый результат:

$ dig +noall +answer www.google.com | \
> awk '{ print $2 }' | \
> { read secs; echo "`expr $secs / 60`m `expr $secs % 60`s remaining ($secs)"; }

вывод:

3m 36s remaining (216)

Я бы хотел обернуть watch команду вокруг этого, чтобы я мог оставить ее работающей в терминале и получить обратный отсчет в реальном времени. Что-то вроде:

$ watch -n 10 "dig +noall +answer www.google.com | \
> awk '{ print $2 }' | \
> { read secs; echo '`expr $secs / 60`m `expr $secs % 60`s remaining ($secs)'; }"

Но это просто приводит к появлению нефункционального экземпляра часов, за которым следует:

expr: syntax error

Я почти уверен, что это какая-то проблема с конвейером / цитированием, и я не так хорошо разбираюсь в тонкостях. Ради переносимости я бы предпочел оставить его однострочным, а не прибегать к сценарию, требующему сохранения на диск. Кто-нибудь знает, как это сделать?

Проблема с синтаксической ошибкой, потому что вы забыли избежать backstick характер, double quote персонаж. И не забудьте убежать dollar sign Кроме того, значение $ secs передается в expr, если вы этого не сделаете, в stdout не будет вывода:

watch -n 10 "dig +noall +answer www.google.com | \
awk '{print\$2}' | \
{ read secs; echo \"\`expr \$secs / 60\`m \`expr \$secs % 60\`s remaining (\$secs)\"; }"

Почему бы не позволить AWK выполнить вычисления и печать?

watch -n 10 'dig +noall +answer google.com | awk '\''{print int($2 / 60) "m", $2 % 60 "s remaining", "(" $2 ")"; exit}'\'''

Прежде всего вам нужно избегать использования expr. Используется редко. Вместо этого у меня есть версия, которая делает то же самое. Не сильно отличается от приведенного выше:

watch -n1 'dig +noall +answer google.com | \ 
 awk "{print \$2}" | \
 { read secs; echo "$((secs / 60 ))m $((secs % 60))s remaining $((secs))";}'

Другой подход, который можно использовать, используя tmux или screen

    while sleep 1; do dig +noall +answer google.com | \ 
   { while read -r secs; do echo "$((secs / 60 ))m $((secs % 60))s remaining $((secs)) seconds"; done < <(awk '{print $2}' | \
   head -n1 ); };  done

Удачи.

Мне кажется, это работает.

watch -n 10 "dig +noall +answer www.google.com | \
 awk '{print \$2}' | \
 { read secs; echo \"\$((\$secs / 60))m \$((\$secs % 60))s remaining\"; }"

или, альтернативно, цитируется, чтобы избежать такого беспорядка:

watch -n 1 'dig +noall +answer www.google.com | \
 awk "{print \$2}" | \
 { read secs; echo "$(($secs / 60))m $(($secs % 60))s remaining"; }'