У меня есть три мысли о возможных решениях вашей проблемы:
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 для запуска. Это будет работать так, как вы написали. Только при использовании в корневой кронтаб. В вашем вопросе не указано, используете ли вы су или же судо, и поэтому я прошел через это, чтобы прояснить два момента:
- Если твой
хрон работа требует корень привилегии, это может быть лучше всего запустить эту работу из корневой кронтаб. Альтернативой является использование судо в пользовательский кронтаб что потенциально неудобно, если аутентификация требуется для судо - как это часто бывает.
-
корневой кронтаб можно получить доступ из учетной записи обычного пользователя, просто используя судо кронтаб -е; то есть не требуется су к корень чтобы получить доступ к корневой кронтаб.
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) в один сценарий, потому что это кажется мне более простым, но у вас могут быть веские причины для этого, и нет никаких причин, по которым это не сработает, если все сделано правильно.