Bash one-liner que mostra uma contagem regressiva em execução até uma atualização de DNS (expiração TTL)

3

Eu me encontro frequentemente encarregado de atualizar os registros DNS e precisando saber exatamente quando a atualização começará (a.k.a expiração do TTL). Eu inventei essa frase de efeito que me dá a saída que eu quero:

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

saída:

3m 36s remaining (216)

Eu gostaria de poder envolver o comando watch em torno disso para que eu possa deixá-lo em execução em um terminal e obter uma contagem regressiva ao vivo. Algo como:

$ 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)'; }"

Mas isso simplesmente resulta em uma instância de relógio não funcional seguida por:

expr: syntax error

Eu tenho certeza que isso é algum tipo de problema de piping / quoting e eu não sou tão bem versado nas complexidades. Por uma questão de portabilidade, eu preferiria mantê-lo como um verso em vez de recorrer a um script que requer salvar em disco. Alguém sabe o caminho certo para conseguir isso?

    
por luckman212 12.07.2013 / 17:31

4 respostas

1

Primeiro de tudo você precisa evitar o uso de expr. É raramente usado. Em vez disso, eu tenho aqui a versão que faz exatamente o mesmo. Não muito diferente do acima:

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

Outra abordagem que pode ser usada usando tmux ou 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

Boa sorte.

    
por 12.07.2013 / 18:16
1

Por que não deixar a AWK fazer as contas e imprimir?

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

O problema de erro de sintaxe, porque você esqueceu de escapar do caractere backstick , o caractere double quote . E lembre-se de também escapar dollar sign , pois o valor de $ secs é passado para expr , se você não o fizer, não há saída para stdout:

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

Isso parece funcionar para mim.

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

ou alternativamente citada para evitar muita confusão:

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