%20%D0%BF%D0%B8%D0%BD%D0%B3%2C%20%D0%BF%D0%BE%D0%BA%D0%B0%20%D1%81%D0%B5%D1%82%D1%8C%20%D0%BD%D0%B5%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%BD%D0%B0%3F.png)
Моя команда 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