Hi всем
Дано - тунель VPN
Проблема - он иногда падает :-)
Вопрос:Решил я автоматизировать процесс проверки состояния тунеля.
Наварганил скриптик который в зависимости от состояния тунеля либо поднимает его заново либа оставляет в покое, если он нормально функцианирует.Скрипт отрабатывает как надо без проблем, но стоит его запуск поместить в crontab начинаются косяки.
Т.Е. при перезапуске тунеля из скрипта он должен вешатся на тот же интерфейс скажем tun0, а по крону он его вешает на новый т.е. tun0 висит, а cron создает tun1.
Понятно что мне так нифига не покатет из за rout'а, да и фаер на tun0 завязан.Не понятно только то, что при ручном запуске скрипт отрабатывает так как нужно.
Вот собственно и вся проблема.
###################################################################################
#!/bin/shi=0
STATE=`ping -c 3 192.168.0.1 > /dev/null 2>&1 && echo UP || echo DOWN`
case "$STATE" in
DOWN)
logger -t $0 -i 'SSH tunnel in state DOWN'
logger -t $0 -i 'vpnstat try change state to UP'PID="$(echo 'printf("%d",(split/\s{1,}/,`ps aux | grep -v "grep" | grep "ppp -auto vpn"`)[1])' | perl)"
if [ ${PID} -gt 0 ];then
/bin/kill -15 ${PID} >/dev/null 2>&1;
else
/sbin/ifconfig tun0 delete > /dev/null 2>&1
fi
/usr/sbin/ppp -auto vpn >/dev/null 2>&1;
logger -t $0 -i 'SSH tunnel in state UP'
break;;
*)
break;;
esac#################################################################################
Да интузиазм АЖНО прет
Че даже ни у кого ни каких идей нет?
>Да интузиазм АЖНО прет
>Че даже ни у кого ни каких идей нет?ну расставь печать пошагам в скрипте и смотри по каким веткам он идет когда из crontab запускается. существует ли в момент подъятия интерфеса предыдущий или нет.
>ну расставь печать пошагам в скрипте и смотри по каким веткам он
>идет когда из crontab запускается. существует ли в момент подъятия интерфеса
>предыдущий или нет.
Ну ты думаешь что я до этого не допер :-)Проблема в другом. По идеи после того как kill поцесс, освобождаются все его ресурсы, так?
Попробуй в системе убить процесс так сказать владелец интерфейса, и этот девайс тоже упадет, т.е. освободит место.Если ты не заметил в скрипте всего два витвления
1. Первое, при наличии ppp процесса убивает его, а следовательно и интерфейс
2. Второе выполняется в случаЕ отсутствия ppp процесса, нагло опускает интерфейс
Тут все просто как три копейки, печать будет в любом случае нормальная.
На последок повторюсь В ОБЫЧНОМ РЕЖИМЕ СКРИПТ ОТРАБАТЫВАЕТ КАК НУЖНО
>>ну расставь печать пошагам в скрипте и смотри по каким веткам он
>>идет когда из crontab запускается. существует ли в момент подъятия интерфеса
>>предыдущий или нет.
>
>
>Ну ты думаешь что я до этого не допер :-)
>
>Проблема в другом. По идеи после того как kill поцесс, освобождаются все
>его ресурсы, так?
>Попробуй в системе убить процесс так сказать владелец интерфейса, и этот девайс
>тоже упадет, т.е. освободит место.
>
>Если ты не заметил в скрипте всего два витвления
>1. Первое, при наличии ppp процесса убивает его, а следовательно и интерфейс
>
>2. Второе выполняется в случаЕ отсутствия ppp процесса, нагло опускает интерфейс
>Тут все просто как три копейки, печать будет в любом случае нормальная.
>
>
>
>На последок повторюсь В ОБЫЧНОМ РЕЖИМЕ СКРИПТ ОТРАБАТЫВАЕТ КАК НУЖНОну а если в обычном режиме работает как нужно, копай в сторону переменных окружения, элементарный PATH проверь(все в лог короче :)), у меня был случай с ЛД_Сонфиг_пас. тоже блин парился.
заодно залогируй что там за пид убивается. сдается мне он в автомате не отрабатывает.
>Ну ты думаешь что я до этого не допер :-)
Я не думаю, мне противопоказано сие действо =)
>
>Проблема в другом. По идеи после того как kill поцесс, освобождаются все
>его ресурсы, так?
>Попробуй в системе убить процесс так сказать владелец интерфейса, и этот девайс
>тоже упадет, т.е. освободит место.
Да я тоже иногда перечитываю матчасть, однако в моей практике был исключительный случай: kill -9 не срабатывал..>
>Если ты не заметил в скрипте всего два витвления
>1. Первое, при наличии ppp процесса убивает его, а следовательно и интерфейс
одно скажу что -15 это не -9
15 - пока дойдет, пока отработает..
даже по -9 сниматься может дольше чем хочется. -9 это жестко)>
>2. Второе выполняется в случаЕ отсутствия ppp процесса, нагло опускает интерфейс
delete это не down :) шучу)>Тут все просто как три копейки, печать будет в любом случае нормальная.
а нас не интересует какая БУДЕТ печать, нас интересует какая печать ПРОИСХОДИТ. Причем именно из под крона. Кстати, пользователь тот же? =)
>На последок повторюсь В ОБЫЧНОМ РЕЖИМЕ СКРИПТ ОТРАБАТЫВАЕТ КАК НУЖНО
крон тупо запускает скрипт и это тоже обычный режим =)
разница только в отсутствии привязки к терминалу :)с чего ему хавать 1 интерфейс, если 0 свободен? видимо не свободен.. а почему не свободен? вот в чем вопрос..
>Скрипт отрабатывает как надо без проблем, но стоит его запуск поместить в
>crontab начинаются косяки.whereis logger
>одно скажу что -15 это не -9
>15 - пока дойдет, пока отработает..
>даже по -9 сниматься может дольше чем хочется. -9 это жестко)Да пробавал я и вместо -15 -9
Даже цикл вставлял для сто процентной уверенностиwhile [ "`ps aux | grep -v 'grep' | grep 'ppp -auto vpn'`" ];do
i=$(($i+1));
done>а нас не интересует какая БУДЕТ печать, нас интересует какая печать ПРОИСХОДИТ. Причем именно из под крона. Кстати, пользователь тот же? =)
Какой пользователь? в кроне от рута запускается
>ну а если в обычном режиме работает как нужно, копай в сторону переменных окружения, элементарный PATH проверь(все в лог короче :)), у меня был случай с ЛД_Сонфиг_пас. тоже блин парился.
>заодно залогируй что там за пид убивается. сдается мне он в автомате не отрабатывает.Вот в окружении я мало что понимаю в смысле переменных
сделал так из ручного режима записываю переменные окружения в файл и то же самое по крону(файлы разные)
вот что выдает diff (приведу тольео разницу р-ручной к-крон)
р-BASH_ENV=/root/.bashrc к-пусто
р-BLOCKSIZE=K к-пусто
р-HISTCONTROL=ignorespace к-пусто
р-PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin к-PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
р-SHELL=/usr/local/bin/bash к-SHELL=/bin/sh
р-SHLVL=3 к-SHLVL=1
р-TERM=xterm к-TERM=dumpВсе остольное одинаково
Долго мучился и спечатью и так в итоге вот что
PID="$(echo 'printf("%d",(split/\s{1,}/,`ps aux | grep -v "grep" | grep "ppp -auto vpn"`)[1])' | perl)"в PID всегда NULL
пробовал так
PS=`ps aux | grep -v 'grep' | grep 'ppp -auto vpn'`
PID=`echo $PPPPS | cut -d ' ' -f2`в PID опять NULL
Че за хрень понять не могу.
Есть соображения
>Долго мучился и спечатью и так в итоге вот что
>PID="$(echo 'printf("%d",(split/\s{1,}/,`ps aux | grep -v "grep" | grep "ppp -auto vpn"`)[1])'
>| perl)"
>
>в PID всегда NULL
>
>пробовал так
>
>PS=`ps aux | grep -v 'grep' | grep 'ppp -auto vpn'`
>PID=`echo $PPPPS | cut -d ' ' -f2`
>
>в PID опять NULL
>
>Че за хрень понять не могу.
>Есть соображенияесть, отлаживать надо лучше :)
уж больно сложное(для меня) у тебя выражение получается вот у меня работает(если находиться только один подобный процесс):name=gnome-pty-helper
aga=`ps aux | grep -v "grep" | grep "$name"`
pid=`echo "printf(\"%d\",(split/\s{1,}/,\"$aga\")[1]);" | perl`
echo Pid is $pidname свое подставь.
>есть, отлаживать надо лучше :)
>уж больно сложное(для меня) у тебя выражение получается вот у меня работает(если
>находиться только один подобный процесс):
>
>name=gnome-pty-helper
>aga=`ps aux | grep -v "grep" | grep "$name"`
>pid=`echo "printf(\"%d\",(split/\s{1,}/,\"$aga\")[1]);" | perl`
>echo Pid is $pid
>
>name свое подставь.
Неа нифига не работает
А ты запускал по крону?
>>есть, отлаживать надо лучше :)
>>уж больно сложное(для меня) у тебя выражение получается вот у меня работает(если
>>находиться только один подобный процесс):
>>
>>name=gnome-pty-helper
>>aga=`ps aux | grep -v "grep" | grep "$name"`
>>pid=`echo "printf(\"%d\",(split/\s{1,}/,\"$aga\")[1]);" | perl`
>>echo Pid is $pid
>>
>>name свое подставь.
>
>
>Неа нифига не работает
>А ты запускал по крону?
вот, работает.0,10,20,30,40,50 * * * * /bin/sh -c /home/?????/work/sh/test/get_pid.sh >>/home/????/work/sh/test/get_pid.log 2>&1
Ну что господа хорошие большое спасибо за помощ и советы
Проблему решил заменой PS на FSTAT
PS отрабатывала както корява(накладывала строки на другие) вообщем на выходе не удавалось найти конкретную строку поиска
Что самое не понятное так это то что на линухе первоначальный скрипт (естественно с другим синтаксисом ifconfig) отрабатывает на УРА, а во фряхе вот такой геморой.Если каму нужно вот рабочий vpnstat
###########################################################################
#!/bin/sh
STATE=`ping -c 3 192.168.0.1 > /dev/null 2>&1 && echo UP || echo DOWN`
case "$STATE" in
DOWN)
logger -t $0 -i 'SSH tunnel in state DOWN'
logger -t $0 -i 'vpnstat try change state to UP'PID=`fstat | grep tun0 | xargs | cut -d ' ' -f3`
if [ "$PID" -gt 0 ]; then
/bin/kill -9 ${PID} >/dev/null 2>&1;
/sbin/ifconfig tun0 down > /dev/null 2>&1
/sbin/ifconfig tun0 delete > /dev/null 2>&1
else
/sbin/ifconfig tun0 down > /dev/null 2>&1
/sbin/ifconfig tun0 delete > /dev/null 2>&1
fi
while [ "`ps aux | grep -v 'grep' | grep 'ppp -auto vpn'`" ];do
i=$(($i+1));
done/usr/sbin/ppp -auto vpn >/dev/null 2>&1;
logger -t $0 -i 'SSH tunnel in state UP'
;;
*)
;;
esacexit 0
###########################################################################