Рейтинг:2

Как я могу быстро перезагрузить хост Linux при сбое сети?

флаг id

у меня есть личный Убунту хост, подключенный к общедоступной / общей сети Wi-Fi АП (не под моим контролем).

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

Я планирую добавить crontab, чтобы проверить сетевое соединение. Если не получится, то перезагрузите компьютер.

Если я вручную запускаю auto_reboot.sh, он перезагружается, когда пинг Тест не пройден. Но запуск из crontab не работает :)

Вот моя запись в crontab

кронтаб -л
* * * * * /root/loadrc/transmissionrc/auto_reboot.sh

Файл /root/loadrc/transmissionrc/auto_reboot.sh

#!/бин/зш

/root/loadrc/networkrc/ping.sh
rc=$?

если [[ $rc -eq 0 ]]
тогда
    echo "говорите, что Интернет восстановлен."
еще
    перезагрузка
фи

Файл /root/loadrc/networkrc/ping.sh

#!/бин/зш
((count = 10)) # Максимальное количество попыток.

в то время как [[ $count -ne 0 ]] ; делать
    ping -c 1 8.8.8.8 # Попробуйте один раз.
    rc=$?
    если [[ $rc -eq 0 ]] ; тогда
        ((count = 1)) # Если все в порядке, выход из цикла.
    еще
        sleep 1 # Свести к минимуму сетевой шторм.
    фи
    ((count = count - 1)) # Так что мы не идем вечно.
сделано

выход $rc

Добавлю немного логов, и намеренно валю интерфейс Wi-Fi:

смотреть ifconfig wlan0 вниз
передачаrc/auto_reboot.sh
#!/бин/зш

эхо "" > /root/loadrc/crontab.log

/root/loadrc/networkrc/ping.sh
rc=$?

если [[ $rc -eq 0 ]]
тогда
    echo "говорите, что Интернет восстановлен."
еще
    перезагрузка
фи
networkrc/ping.sh
#!/бин/зш
((count = 10)) # Максимальное количество попыток.


в то время как [[ $count -ne 0 ]] ; делать
    /usr/bin/ping -c 1 8.8.8.8 >> /root/loadrc/crontab.log 2>&1
    echo "шаг --> 2" >> /root/loadrc/crontab.log
    rc=$?

    если [[ $rc -eq 0 ]] ; тогда
        echo "шаг --> 3" >> /root/loadrc/crontab.log
        ((count = 1)) # Если все в порядке, выход из цикла.
    еще
        echo "шаг --> 4" >> /root/loadrc/crontab.log
        sleep 1 # Свести к минимуму сетевой шторм.
    фи
    ((count = count - 1)) # Так что мы не идем вечно.
сделано

выход $rc

Файл /root/loadrc/crontab.log

/usr/bin/ping: подключение: сеть недоступна
шаг --> 2
шаг --> 3

это означает, что в режиме crontab, даже если тест ping не пройден, код возврата по-прежнему равен нулю.

Итак, возникает вопрос: как я могу проверить сетевое соединение в режиме crontab?

djdomi avatar
флаг za
это похоже на проблему x и y, какую исходную проблему вы пытаетесь решить?
флаг sn
Re *"персональный хост Ubuntu"*: не будет ли это не по теме?
флаг br
Я бы использовал для этого не cron, а сторожевой таймер, который специально разработан для перезагрузки локальной машины, если какое-то условие не выполняется, и позволяет запускать пользовательские команды в качестве проверок.
Рейтинг:7
флаг cn
Bob
/usr/bin/ping -c 1 8.8.8.8 >> /root/loadrc/crontab.log 2>&1 
echo "шаг --> 2" >> /root/loadrc/crontab.log  
rc=$?

Я думаю, что это проверяет код выхода эхо команда, в то время как вашей логике нужен код выхода пинг команда.

huangyingw avatar
флаг id
да, ошибка в моем эхе, спасибо, что указали на это.
marcelm avatar
флаг ng
@huangyingw Итак, вы можете обновить свой вопрос, чтобы исправить это?
Рейтинг:2
флаг il

У меня есть три мысли о возможных решениях вашей проблемы:

1. Вы сказали:

Если я вручную запускаю auto_reboot.sh, он перезагружается при сбое теста ping. Но запуск из crontab не работает :)

Обычно, когда команда работает правильно в вашей интерактивной оболочке (из CLI), но не работает должным образом в хрон это связано с разницей в среда; например хрон имеет другой PATH, чем вы в своей интерактивной оболочке. Обычно, хрон среда это: ПУТЬ=/USR/бен:/бен. Любой скрипт ты бежишь бежать под хрон не сможет найти исполняемые файлы, которых нет в ПУТИ.

Кстати, вы можете проверить хрон среду в вашей системе, просто запустив окружение используя ваш кронтаб:

* * * * * /usr/bin/env > /my/cronlog/location/mycronenvironment.txt 2>&1

В вашей auto_reboot.sh, вы не использовали полный путь за перезагрузка. Как перезагрузка обычно находится в /sbin/перезагрузка, и /сбин может не быть в PATH, используемом хрон, это потенциальная проблема.

Следовательно, я предлагаю вам проверить среду (PATH), используемую хрон, и перепроверьте все ваши команды: 1) на хрон PATH или 2) использовать полная спецификация пути.

2. Вы запускаете все из /корень каталог

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

Не пытаясь быть педантичным, я хотел бы сказать, что корень аккаунт имеет кронтаб который работает независимо от любого пользователь кронтаб. Так же корневой кронтаб не требует судо использоваться - все, что сделано в корневой кронтаб сделано с корень привилегии.

Все это сказало, я вижу призыв к перезагрузка в вашем скрипте - команда, которая требует привилегии root для запуска. Это будет работать так, как вы написали. Только при использовании в корневой кронтаб. В вашем вопросе не указано, используете ли вы су или же судо, и поэтому я прошел через это, чтобы прояснить два момента:

  1. Если твой хрон работа требует корень привилегии, это может быть лучше всего запустить эту работу из корневой кронтаб. Альтернативой является использование судо в пользовательский кронтаб что потенциально неудобно, если аутентификация требуется для судо - как это часто бывает.
  1. корневой кронтаб можно получить доступ из учетной записи обычного пользователя, просто используя судо кронтаб -е; то есть не требуется су к корень чтобы получить доступ к корневой кронтаб.

3. У вас может быть логическая ошибка в вашем скрипте

Как указано в другой ответ, непонятно, можно ли полагаться на значение радиоуправляемый от твоего пинг.ш сценарий как условие перезагрузка. К сожалению, то, является ли это проблемой, маскируется тем, что кажется двумя разными версиями пинг.ш script в вашем вопросе - неясно, используете ли вы первую версию:

#!/бин/зш
((count = 10)) # Максимальное количество попыток.

в то время как [[ $count -ne 0 ]] ; делать
    ping -c 1 8.8.8.8 # Попробуйте один раз.
    rc=$?

или вторая версия:

#!/бин/зш
((count = 10)) # Максимальное количество попыток.


в то время как [[ $count -ne 0 ]] ; делать
    /usr/bin/ping -c 1 8.8.8.8 >> /root/loadrc/crontab.log 2>&1
    echo "шаг --> 2" >> /root/loadrc/crontab.log
    rc=$?

Строго как мой личный выбор, я бы предпочел объединить код из этих двух скриптов (пинг.ш и auto_reboot.sh) в один сценарий, потому что это кажется мне более простым, но у вас могут быть веские причины для этого, и нет никаких причин, по которым это не сработает, если все сделано правильно.

huangyingw avatar
флаг id
спасибо за ваш ответ, да, я нашел причину, мне нужно использовать полный путь команды перезагрузки. Я изолировал логику в ping.sh для лучшего повторного использования, возможно, она может понадобиться другим моим сценариям. это мой личный безголовый Linux просто для удовольствия, поэтому я всегда входил в систему как root, cron и скрипты запускаются как root. один дополнительный вопрос: если я (root) не вошел в систему, будет ли корневой cron выполнять свою работу? то, что я хочу, это cron, даже если ни один пользователь (включая root) не войдет в систему, он все равно будет регулярно запускаться, проверять состояние сети и перезагружаться при необходимости. @симус
Seamus avatar
флаг il
@huangyingw: *"`один дополнительный вопрос: если я (root) не вошел в систему, будет ли корневой cron выполнять свою работу? `"* Да, `cron` - это *демон*, который работает в фоновом режиме без вмешательства пользователя обязательный; его единственная цель - запускать задания, даже если пользователь не вошел в систему.
huangyingw avatar
флаг id
приятно слышать, спасибо. @симус
Seamus avatar
флаг il
@huangyingw: добро пожаловать - и, пожалуйста, не забудьте [проголосовать за любой ответ, который вы считаете *полезным*, и *выбрать* ответ](https://serverfault.com/help/someone-answers), если это уместно .

Ответить или комментировать

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