Подавите “Будильник: 14” от ping

Попробуйте передающее количество строк контекста к grep.

| grep -C 5

распечатает 5 строк прежде и после соответствия.

4
21.10.2013, 16:36
2 ответа

Вытяните ping в свою собственную функцию и делают то, что Вы хотите там с результатами. В конце возвращают 0 или 1 в зависимости от состояния внутренне в функции.

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

Кроме того, можно использовать более тщательно продуманное case/switch в функции, если необходимо действовать по-другому при получении различных состояний от ping.

case "$status" in
    1) return 0 ## success   ;;
    0) return 1 ## fail      ;;
    *) ### do something else ;;
esac
2
27.01.2020, 20:54
  • 1
    Это не работало бы, поскольку я не могу извлечь код выхода из ping затем. –  Tyilo 21.10.2013, 17:09
  • 2
    @Tyilo - видит, что –  slm♦ 21.10.2013, 17:19
  • 3
    , который не работает ни один как: 1) grep будет ожидать сплошной линии, однако выводы сценария # на за один раз и я хочу видеть их 2), Это также удалило бы целую строку включая предыдущее # 3) Я думаю ping делает что-то как echo foobar > /dev/tty, который не может быть заблокирован как этот. –  Tyilo 21.10.2013, 17:39
  • 4
    @Tyilo - кто-то упомянул, что была опечатка в Вашем ping команда в чат-комнате. -Q нуждается в аргументе. ping -Q <some num> -c 1 -t 1 google.com. –  slm♦ 21.10.2013, 19:01
  • 5
    @Tyilo - В 3-й раз очарование? –  slm♦ 21.10.2013, 19:13

Ваша проблема в том, что ваша команда ping содержит -t 1, чтобы сказать ping сдаться через 1 секунду. Это вызывает сигнал SIGALRM, который ping не может отловить. (Возможно, это ошибка ping, но это не важно). Оболочка bash сообщает об этом как Alarm clock: 14 и прерывает процесс со статусом выхода 142 ; 128 (это флаг "я поймал сигнал") + 14 (идентификатор SIGALRM).

Есть два способа справиться с этим:

1) Удалить -t 1, чтобы SIGALRM не генерировался. Вместо этого ping завершится через (по моему опыту) 5 секунд и выдаст другой статус ошибки, чем вы сейчас видите; вероятно, 68, если указанный хост не может быть достигнут. В этом случае вы также можете добавить "-o" к вашему ping, чтобы он завершился, как только хост станет достижимым.

2) Выполните trap - SIGALRM непосредственно перед командой ping, чтобы сказать оболочке игнорировать сигнал. 1-секундный тайм-аут все равно произойдет, и статус выхода будет 142. По крайней мере, так было на iMac под управлением Yosemite (10.10.5), на котором я это пробовал.

3
27.01.2020, 20:54

Теги

Похожие вопросы