Есть ли способ запустить (повторяющийся) пинг, пока сеть недоступна?

Есть ли способ запустить (повторяющийся) пинг, пока сеть недоступна?

Моя команда ping (в Debian 6 или 7) будет неоднократно пытаться выполнить ping сервера, даже если сеть не работает,еслисеть была включена, когда он был запущен. Есть ли способ запустить ping, когда сеть выключена, и получить такое же поведение?

Вот пример. Если я начну повторяющийся пинг, когда сеть работает, и пока пинг выполняется, сеть отключится, пинг продолжит повторяться. Если сеть снова заработает, она продолжит пинг:

me@here:~$ ping -n 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_req=1 ttl=46 time=117 ms
...
64 bytes from 8.8.8.8: icmp_req=6 ttl=46 time=116 ms
ping: sendmsg: Network is unreachable
...
ping: sendmsg: Network is unreachable
64 bytes from 8.8.8.8: icmp_req=108 ttl=46 time=694 ms
...

Однако, если сеть не работает при запуске ping:

me@here:~$ ping -n 8.8.8.8
connect: Network is unreachable
me@here:~$

Это та же проблема недоступности сети, но ping не продолжает попытки, пока сеть не заработает снова, как это было раньше.

решение1

Вы можете использовать цикл while в скрипте оболочки:

failed=1 # any number not equal to zero
while [ $failed -ne 0 ]
do
   ping -n 8.8.8.8
   failed=$?
done
# after the  $? becomes "0" it will get out of the while loop
echo "ping succeeded"

Чтобы прекратить вывод connect: Network is unreachableсообщения, вы можете отредактировать строку с помощью ping следующим образом:

ping -n 8.8.8.8 2> /dev/null

Или вы можете добавить sleepв цикл, чтобы уменьшить количество таких сообщений.

Сценарий можно упростить до

while ! ping -n 8.8.8.8
do
    sleep 1
done

Что позволяет записать это в одну строку:

while ! ping -n 8.8.8.8; do sleep 1; done

решение2

AFAICT, pingне будет работать, если он не может открыть сокет на интерфейсе (потому что интерфейс не работает). Если вы проверите свои устройства с помощью ip link show, вы увидите, какие устройствавверхиливниз.

Попробуйте сначала активировать сетевое устройство.

$ sudo ip link set <iface> up
$ ping -n 8.8.8.8

Я протестировал это на моем компьютере с Arch Linux с помощьювнизИнтерфейс Wi-Fi ивверхвиртуальный интерфейс ethernet (IP-адрес не назначен). A pingна первом завершает работу, а на втором ping— продолжает работу.

В противном случае используйте скрипт оболочки Networker.

решение3

Вы можете использовать fpingс его параметрами -lи -Iвместо ping. Для этого необходимо знать имя интерфейса и запустить его как root:

root@here:~# fping -l -I wlan0 -n 8.8.8.8

me@here:~$ sudo fping -l -I eth0 -n 8.8.8.8

Связанный контент