Я пишу сценарий оболочки, который вызывает интерфейс Ethernet (настроенный для DHCP), чтобы определить, подключен ли он к сети. Если это не так, я хотел бы своевременно сообщить (в течение нескольких секунд), что нет связи. К сожалению, в отсутствие соединения ifup, кажется, ждет несколько минут до истечения времени ожидания, и на странице руководства не указывается параметр таймаута. Есть ли способ остановить его через несколько секунд?
Это на Ubuntu Server 11.10; NetworkManager не используется.
Наконец-то я нашел способ.
Как оказалось, так как я действительно хочу сделать, это проверить ссылку, мне совсем не нужно ifup. Вместо этого я могу использовать ethtool (хотя он должен быть установлен первым), например:
connected=$(ethtool eth0 | awk '/Link detected:/ { print $3 }')
Если, однако, мне нужно было проверить ifup, я мог бы использовать фоновый процесс и переменной оболочки $!. Если бы я просто хотел проверить, продолжался ли он после таймаута, я мог бы это сделать:
ifup eth0 &
sleep 5
if ps -p $! | grep -q "$!"; then
connected='no'
kill $!
else
connected='yes'
fi
Если бы я хотел записать результат из ifup, лучшим вариантом было бы, вероятно, перенаправление это во временный файл. (Я смотрел в именованные каналы, но я не думаю, что они будут работать для этой цели, ifup будет блокироваться до тех пор, пока другой процесс не будет читать свой вывод.)
Вы не сказали, что используете для уведомления.
[[ -n "$(ifconfig | grep '192.*' )" ]] || echo "down"
Измените «192» на префикс вашей сети (чаще всего 192.168.xy).
] Измените «echo» вниз «» на ваше уведомление.
Запустите эту команду из cron с некоторым разумным интервалом.
Возможно, что-то похожее на строки
[[ -n "$(ifconfig | grep '192.*' )" ]] || dhclient eth0
запускается раз в минуту?