Я пишу сценарий оболочки, который вызывает интерфейс Ethernet (настроенный для DHCP), чтобы определить, подключен ли он к сети. Если это не так, я бы хотел своевременно (в течение нескольких секунд) сообщить, что соединения нет. К сожалению, при отсутствии соединения ifup, похоже, подождет несколько минут, прежде чем истечет время ожидания, и на странице man не будет указан параметр timeout. Есть ли способ остановить его через несколько секунд?
Это на Ubuntu Server 11.10; NetworkManager не используется.
Вы не сказали, что вы используете для уведомления.
[[ -n "$(ifconfig | grep '192.*' )" ]] || echo "down"
Измените «192» на префикс вашей сети (192.168.x.y является наиболее распространенным).
Измените "echo" down "" на ваше уведомление.
Запустите эту команду из cron с некоторым разумным интервалом.
Возможно, что-то вроде
[[ -n "$(ifconfig | grep '192.*' )" ]] || dhclient eth0
выполняется раз в минуту или около того?
Я наконец нашел способ.
Как выясняется, поскольку я действительно хочу проверить ссылку, мне вообще не нужен 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
будет блокироваться, пока другой процесс не будет читать свои выходные данные.)