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