ожидание сети в сценарии удара

Это просто даст Вам сильно поврежденную систему. Почему Вы хотите сделать что-то это причудливое во-первых?

Я подозреваю, что это - проблема XY: Вы нуждаетесь X, выясняете, что способ сделать это через Y, и спросите о Y. Не зная, какой X, нет никакого способа, которым мы могли дать разумные решения для него.

9
29.07.2014, 01:38
4 ответа

Синтаксис оболочки

Кажется, вы сбиты с толку относительно условных обозначений в сценариях оболочки. Каждая команда оболочки имеет статус выхода, который представляет собой целое число от 0 до 255, где 0 означает успех, а любое другое значение означает сбой. Такие операторы, как if и while , которые ожидают логические операнды, проверяют статус выхода команды и рассматривают 0 (успех) как истину, а любое другое значение (неудача) как ложь.

Например, команда grep возвращает 0, если шаблон найден, и 1, если шаблон не найден. Итак,

while ifconfig | grep "192.168.100." > /dev/null; do …

повторяет цикл до тех пор, пока шаблон 192.168.100. находится в выходных данных ifconfig . Обратите внимание, что шаблон 192.168.100. соответствует таким строкам, как 192x168 1007 , потому что . в регулярном выражении соответствует любому символу; для поиска буквальной строки передайте параметр -F в grep . Чтобы инвертировать условие, положите ! впереди.

while ! ifconfig | grep -F "192.168.100." > /dev/null; do …

Далее в сценарии вы хотите сравнить значение переменной с числом. Вы используете оператор -gt , который является частью синтаксиса условных выражений of , понимаемых командой test . Команда test возвращает 0, если условное выражение истинно, и 1, если условное выражение ложно.

if test "$x" -gt 200; then

Обычно используется альтернативное имя [ для команды test . Это имя предполагает, что команда завершится параметром ] . Два способа написания этой команды полностью эквивалентны.

if [ "$x" -gt 200 ]; then

Bash также предлагает третий способ записи этой команды со специальным синтаксисом [[…]] . Этот специальный синтаксис может поддерживать на несколько больше операторов, чем [, потому что [ - обычная команда, подчиняющаяся обычным правилам синтаксического анализа, а [[…]] - часть синтаксиса оболочки.

И снова имейте в виду, что [ предназначен для условных выражений , которые представляют собой синтаксис с такими операторами, как -n , -gt ],… [ не означает «логическое значение»: любая команда имеет логическое значение (статус выхода = 0?).

Обнаружение того, что сеть работает

Ваш способ определения того, что сеть работает, не является надежным. В частности, обратите внимание, что ваш сценарий будет запущен, как только какой-либо сетевой интерфейс получит IP-адрес в указанном диапазоне. В частности, вполне возможно, что на этом этапе DNS еще не будет работать, не говоря уже о подключенных сетевых ресурсах.

Вам действительно нужно запускать эти команды, когда кто-то входит в систему? Когда сеть подключена, проще сделать так, чтобы команда выполнялась автоматически. Способ сделать это зависит от вашего дистрибутива и от того, используете ли вы NetworkManager.

Если вам нужно запустить эти команды как часть сценариев входа в систему, то проверьте ресурс, который вам действительно нужен, а не наличие IP-адреса. Например, если вы хотите проверить, смонтирован ли / net / somenode / somedir , используйте

while ! grep -q /net/somenode/somedir </proc/mounts; do
  sleep 1
done

. Если у вас есть upstart или systemd…

, вы можете его использовать. Например, с Upstart , отметьте свою работу как start on net-device-up eth0 (замените eth0 именем интерфейса, который обеспечивает желаемое сетевое соединение). Для Systemd см. Вызов сценария для выполнения после запуска сети?

8
27.01.2020, 20:07

Просто посчитайте вывод ip add show Например:

root@xxxxxxlp01 ~ $ ip add sh dev eth3 | grep inet
root@xxxxxxlp01 ~ $ ip add sh dev eth1 | grep inet
root@xxxxxxlp01 ~ $ ip add sh dev eth0 | grep inet
    inet xxx.xxx.64.91/24 brd xxx.xxx.95.255 scope global eth0
    inet6 fe80::224:e8ff:fe78:4dfb/64 scope link
root@xxxxxxlp01 ~ $ ip add sh dev eth0 | grep inet | wc -l
2

Затем вы можете просто перейти по номеру возвращаемой строки, если это необходимо. Вы, вероятно, просто проверите, было ли оно нулем, и если да, то засыпайте и повторите цикл.

Непроверенный код для иллюстрации:

while [ 1 ]; do

  if [ $(ip add sh dev eth0 | grep inet | wc -l) -ne 0 ]; then
     break
  fi

  sleep 1

done
1
27.01.2020, 20:07

Ping вернет ответ 0, если хотя бы одна попытка была успешной. Вы можете проверить связь с сервером, к которому вы подключаетесь, до тех пор, пока он не будет успешным.

1
27.01.2020, 20:07

Вы можете использовать команду hostname.

с опцией -I, вы получите свой локальный IP-адрес, который будет возвращен вашим DHCP-сервером.

hostname -I
# (if has network) return: 192.168.100 or other IP local

Проверьте этот очень простой пример:

while [ "$(hostname -I)" = "" ]; do
  echo -e "\e[1A\e[KNo network: $(date)"
  sleep 1
done

echo "I have network";

Я думал и проверял другие ответы.

И, возможно, если вы хотите проверить подключение к вашему серверу.

Я расшифровываю тот же сценарий, но теперь жду соединения с сервером.

# ip server
serverAdr="192.168.0.1"

ping -c 1 $serverAdr > /dev/null 2>&1
while [ $? -ne 0 ]; do
  echo -e "\e[1A\e[K $(date): Connecting - ${serverAdr}"
  sleep 1
  ping -c 1 $serverAdr > /dev/null 2>&1
done

echo "$(date): Connected - ${serverAdr}";
1
23.10.2020, 17:59

Теги

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