URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6562
[ Назад ]

Исходное сообщение
"shell скрипт в cron'е(косяк)"

Отправлено quest , 25-Июн-07 10:52 
Hi всем
Дано - тунель VPN
Проблема - он иногда падает :-)
Вопрос:

Решил я автоматизировать процесс проверки состояния тунеля.
Наварганил скриптик который в зависимости от состояния тунеля либо поднимает его заново либа оставляет в покое, если он нормально функцианирует.

Скрипт отрабатывает как надо без проблем, но стоит его запуск поместить в crontab начинаются косяки.
Т.Е. при перезапуске тунеля из скрипта он должен вешатся на тот же интерфейс скажем tun0, а по крону он его вешает на новый т.е. tun0 висит, а cron создает tun1.
Понятно что мне так нифига не покатет из за rout'а, да и фаер на tun0 завязан.

Не понятно только то, что при ручном запуске скрипт отрабатывает так как нужно.

Вот собственно и вся проблема.

###################################################################################
#!/bin/sh

i=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

#################################################################################


Содержание

Сообщения в этом обсуждении
"shell скрипт в cron'е(косяк)"
Отправлено guest , 25-Июн-07 15:52 
Да интузиазм АЖНО прет
Че даже ни у кого ни каких идей нет?

"shell скрипт в cron'е(косяк)"
Отправлено vic , 25-Июн-07 16:13 
>Да интузиазм АЖНО прет
>Че даже ни у кого ни каких идей нет?

ну расставь печать пошагам в скрипте и смотри по каким веткам он идет когда из crontab запускается. существует ли в момент подъятия интерфеса предыдущий или нет.


"shell скрипт в cron'е(косяк)"
Отправлено guest , 25-Июн-07 16:45 
>ну расставь печать пошагам в скрипте и смотри по каким веткам он
>идет когда из crontab запускается. существует ли в момент подъятия интерфеса
>предыдущий или нет.


Ну ты думаешь что я до этого не допер :-)

Проблема в другом. По идеи после того как kill поцесс, освобождаются все его ресурсы, так?
Попробуй в системе убить процесс так сказать владелец интерфейса, и этот девайс тоже упадет, т.е. освободит место.

Если ты не заметил в скрипте всего два витвления
1. Первое, при наличии ppp процесса убивает его, а следовательно и интерфейс
2. Второе выполняется в случаЕ отсутствия ppp процесса, нагло опускает интерфейс
Тут все просто как три копейки, печать будет в любом случае нормальная.


На последок повторюсь В ОБЫЧНОМ РЕЖИМЕ СКРИПТ ОТРАБАТЫВАЕТ КАК НУЖНО


"shell скрипт в cron'е(косяк)"
Отправлено NuINu , 25-Июн-07 17:39 
>>ну расставь печать пошагам в скрипте и смотри по каким веткам он
>>идет когда из crontab запускается. существует ли в момент подъятия интерфеса
>>предыдущий или нет.
>
>
>Ну ты думаешь что я до этого не допер :-)
>
>Проблема в другом. По идеи после того как kill поцесс, освобождаются все
>его ресурсы, так?
>Попробуй в системе убить процесс так сказать владелец интерфейса, и этот девайс
>тоже упадет, т.е. освободит место.
>
>Если ты не заметил в скрипте всего два витвления
>1. Первое, при наличии ppp процесса убивает его, а следовательно и интерфейс
>
>2. Второе выполняется в случаЕ отсутствия ppp процесса, нагло опускает интерфейс
>Тут все просто как три копейки, печать будет в любом случае нормальная.
>
>
>
>На последок повторюсь В ОБЫЧНОМ РЕЖИМЕ СКРИПТ ОТРАБАТЫВАЕТ КАК НУЖНО

ну а если в обычном режиме работает как нужно, копай в сторону переменных окружения, элементарный PATH проверь(все в лог короче :)), у меня был случай с ЛД_Сонфиг_пас. тоже блин парился.
заодно залогируй что там за пид убивается. сдается мне он в автомате не отрабатывает.


"shell скрипт в cron'е(косяк)"
Отправлено vic , 25-Июн-07 17:54 
>Ну ты думаешь что я до этого не допер :-)
Я не думаю, мне противопоказано сие действо =)
>
>Проблема в другом. По идеи после того как kill поцесс, освобождаются все
>его ресурсы, так?
>Попробуй в системе убить процесс так сказать владелец интерфейса, и этот девайс
>тоже упадет, т.е. освободит место.
Да я тоже иногда перечитываю матчасть, однако в моей практике был исключительный случай: kill -9 не срабатывал..

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

>
>2. Второе выполняется в случаЕ отсутствия ppp процесса, нагло опускает интерфейс
delete это не down :) шучу)

>Тут все просто как три копейки, печать будет в любом случае нормальная.
а нас не интересует какая БУДЕТ печать, нас интересует какая печать ПРОИСХОДИТ. Причем именно из под крона. Кстати, пользователь тот же? =)


>На последок повторюсь В ОБЫЧНОМ РЕЖИМЕ СКРИПТ ОТРАБАТЫВАЕТ КАК НУЖНО
крон тупо запускает скрипт и это тоже обычный режим =)
разница только в отсутствии привязки к терминалу :)

с чего ему хавать 1 интерфейс, если 0 свободен? видимо не свободен.. а почему не свободен? вот в чем вопрос..


"shell скрипт в cron'е(косяк)"
Отправлено universite , 26-Июн-07 06:34 

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

whereis logger


"shell скрипт в cron'е(косяк)"
Отправлено quest , 26-Июн-07 09:15 
>одно скажу что -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

Че за хрень понять не могу.
Есть соображения


"shell скрипт в cron'е(косяк)"
Отправлено NuINu , 26-Июн-07 10:04 

>Долго мучился и спечатью и так в итоге вот что
>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 $pid

name свое подставь.


"shell скрипт в cron'е(косяк)"
Отправлено quest , 26-Июн-07 11:23 
>есть, отлаживать надо лучше :)
>уж больно сложное(для меня) у тебя выражение получается вот у меня работает(если
>находиться только один подобный процесс):
>
>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 свое подставь.


Неа нифига не работает
А ты запускал по крону?


"shell скрипт в cron'е(косяк)"
Отправлено NuINu , 26-Июн-07 11:50 
>>есть, отлаживать надо лучше :)
>>уж больно сложное(для меня) у тебя выражение получается вот у меня работает(если
>>находиться только один подобный процесс):
>>
>>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


"shell скрипт в cron'е(косяк)"
Отправлено quest , 26-Июн-07 12:40 
Ну что господа хорошие большое спасибо за помощ и советы
Проблему решил заменой 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'
        ;;
    *)
        ;;
esac

exit 0


###########################################################################