Suprimir “Despertador: 14” do ping

4

Eu fiz um script simples para reiniciar meu roteador e depois mostrar uma barra de progresso até que meu computador tenha uma conexão com a internet novamente.

Ao executar o script, recebo a seguinte saída:

The router is now rebooting...
############################################bin/reboot_router: line 48:  4758 Alarm clock: 14         ping -Q -c 1 -t 1 google.com >&/dev/null
#bin/reboot_router: line 48:  4761 Alarm clock: 14         ping -Q -c 1 -t 1 google.com >&/dev/null
#bin/reboot_router: line 48:  4763 Alarm clock: 14         ping -Q -c 1 -t 1 google.com >&/dev/null
#####bin/reboot_router: line 48:  4773 Alarm clock: 14         ping -Q -c 1 -t 1 google.com >&/dev/null
#bin/reboot_router: line 48:  4775 Alarm clock: 14         ping -Q -c 1 -t 1 google.com >&/dev/null
##bin/reboot_router: line 48:  4777 Alarm clock: 14         ping -Q -c 1 -t 1 google.com >&/dev/null
#

Eu quero impedir que a coisa Alarm clock: 14 apareça, então a saída se torna:

The router is now rebooting...
#######################################################

A parte relevante do script é:

#!/bin/bash

COLUMNS=$(tput cols)

# Reboot router code here

echo 'The router is now rebooting...'

min_time=60
max_time=120
start_time=$SECONDS
time=0
progress=0

until [[ $min_time -lt $time ]] && ping -Q -c 1 -t 1 google.com &> /dev/null; do
    let time=SECONDS-start_time
    let new_progress=COLUMNS*time/max_time
    let diff=new_progress-progress
    let progress=new_progress
    for((i=0; i<diff; i++)); do
        echo -n '#'
    done
    sleep 1
done

echo
    
por Tyilo 21.10.2013 / 15:36

2 respostas

2

Puxe o ping para sua própria função e faça o que quiser com os resultados. No final, retorne um 0 ou 1 dependendo do status internamente na função.

ping_func(){
    results=$(ping -c 1 -t 1 google.com &> /dev/null)
    return $?
}

until [[ $min_time -lt $time ]] && ping_func; do
    let time=SECONDS-start_time
    let new_progress=COLUMNS*time/max_time
    let diff=new_progress-progress
    let progress=new_progress
    for((i=0; i<diff; i++)); do
        echo -n '#'
    done
    sleep 1
done

echo

Como alternativa, você pode usar um case/switch mais elaborado dentro da função se precisar agir de maneira diferente ao obter status diferentes de ping .

case "$status" in
    1) return 0 ## success   ;;
    0) return 1 ## fail      ;;
    *) ### do something else ;;
esac
    
por 21.10.2013 / 15:40
3

Seu problema é que seu comando ping contém -t 1 para informar ao ping para desistir após 1 segundo. Isso está causando um sinal SIGALRM que o ping não consegue interceptar internamente. (Este é indiscutivelmente um erro de ping, mas isso é acadêmico). O shell bash relata isso como Alarm clock: 14 e anula o processo com um status de saída de 142 ; 128 (que é a flag "peguei um sinal") + 14 (o id SIGALRM).

Existem duas maneiras de lidar com isso:

1) Remova o -t 1 para que o SIGALRM não seja gerado. Em vez disso, o ping expirará em (na minha experiência) 5 segundos e apresentará um status de erro diferente do que você está vendo no momento; provavelmente 68 se o host especificado não puder ser alcançado. Nesse caso, você também pode querer adicionar "-o" ao seu ping para que ele seja encerrado assim que o host se tornar acessível.

2) Execute trap - SIGALRM antes de seu comando ping, para dizer ao shell para ignorar o sinal. O tempo limite de 1 segundo ainda ocorrerá e o status de saída ainda será 142 . Pelo menos, foi o que aconteceu no iMac rodando o Yosemite (10.10.5) no qual eu tentei.

    
por 18.12.2015 / 21:50