Сабж.
Скрипт следующего содержания:
#!/bin/bash
if ps -A | grep ppp; then
echo соединение установлено
if ip addr | grep ppp1; then
echo по правильном интерфейсу
else
echo интерфейс отличается от ppp1 - завершаем pppd и поднимаем интерфейс ppp1
killall pppd
sleep 2
/sbin/ifup ppp1
fi
else
echo соединения нет. Поднимаем.
/sbin/ifup ppp1
fi
Запускается по крону, строчка из crontab:
*/2 * * * * root /var/scripts/check_ppp.sh
Когда запускаю из командной строки, то все нормально: если соединение установлено через правильный интерфейс - ничего не делаем. Если соединение не установлено, то устанавливаем. Если установлено через неправильный интерфейс (например ppp0), то завершаем все pppd, ждем пару секунд и поднимаем ppp1.
А по крону почему-то первое условие проходит (соединение установлено), а вот второе условие не проходит - делает killall pppd и поднимает соединение опять.
В какую сторону копнуть?
______
РЕШЕНО:
Сам дурак ;)
При запуске по крону указанной строчкой, как я понимаю, пути к /sbin в PATH нет. Поэтому команда ничего не возвращала (кроме того, что команды ip не найдено, но это, как я понимаю, в if не доходит).
А в процессе отладки я работал через su -
ЗЫ Да, измененный скрипт:
#!/bin/bash
pppd_stat=`ps -A | grep pppd`
if test "$pppd_stat"; then
echo `date +"%F %H:%M"` pppoe установлено >> /var/log/check_ppp.log
ppp1_exist=`/sbin/ip addr | grep ppp1`
if test "$ppp1_exist"; then
echo `date +"%F %H:%M"` Нужный интерфейс запущен >> /var/log/check_ppp.log
else
echo `date +"%F %H:%M"` Поднят не тот интерфейс, завершаем все pppd >> /var/log/check_ppp.log
killall pppd
sleep 2
/sbin/ifup ppp1
fi
else
echo `date +"%F %H:%M"` pppoe не установлено. Поднимаем ppp1 >> /var/log/check_ppp.log
/sbin/ifup ppp1
fi
Переменные использую, чтобы в мыло не валился вывод команд.