Страница 1 из 1

Глюк if скрипта при запуске через cron

Добавлено: 2012-10-10 10:16:58
mmvds
Всем привет! Есть часть скрипта:

Код: Выделить всё

 dir=/home/scripts
 if [ $res -eq '1' ];
 then
    echo YES $res $status >> $dir/logmsg.log
    if [ "$status" == 'DOWN' ];
    then
    status="UP"
    echo $status >> $dir/logmsg.log
    fi
 else
    echo NO $res $status >> $dir/logmsg.log
    if [ "$status" == 'UP' ];
    then
    status="DOWN"
    echo $status >> $dir/logmsg.log
    fi
fi 
данные берутся из файла, но не суть, т.к. с эти проблем нет
проблема в том что при запуске вручную скрипт прекрасно работает, при запуске через крон вложенные условия if [ "$status" == 'DOWN' ]; и if [ "$status" == 'UP' ]; не обрабатываются
при этом if [ $res -eq '1' ]; - обрабатывается
т.е. лог выглядит так:
YES 1 DOWN
YES 1 DOWN
....

а должен

YES 1 DOWN
UP
YES 1 UP
YES 1 UP

директива запуска именно через #!/usr/local/bin/bash в скрипте тоже есть

Подскажите, в чем может быть загвоздка?

Re: Глюк if скрипта при запуске через cron

Добавлено: 2012-10-10 11:31:36
mak_v_
Откуда берётся переменная $status???

Re: Глюк if скрипта при запуске через cron

Добавлено: 2012-10-10 11:32:20
kpp
Перед этим блоком , после Весь вывод скрипта перенаправить в файл

Код: Выделить всё

/../script.sh > /var/log/test_script.log 2>&1
Проанализировать файл /var/log/test_script.log

Re: Глюк if скрипта при запуске через cron

Добавлено: 2012-10-10 12:09:57
mmvds
Лог выглядит так

Код: Выделить всё

+ [ 1 -eq 1 ]
+ echo YES 1 DOWN
+ [ DOWN == DOWN ]
[: DOWN: unexpected operator
+ set +x
т.е. ему не нравится само выражение [ DOWN == DOWN ] хотя при запуске вручную, тот же лог:

Код: Выделить всё

++ '[' 1 -eq 1 ']'
++ echo YES 1 DOWN
++ '[' DOWN == DOWN ']'
++ status=UP
++ echo UP
++ set +x

Re: Глюк if скрипта при запуске через cron

Добавлено: 2012-10-10 12:16:50
mmvds
mak_v_ писал(а):Откуда берётся переменная $status???
по поводу переменной status - берется из файла, но она успешно считывается

Re: Глюк if скрипта при запуске через cron

Добавлено: 2012-10-10 12:28:18
mmvds
в общем решилось просто - указал в кроне /usr/local/bin/bash /home/scripts/script.sh
Правда вопрос остается, почему он проигнорил #!/usr/local/bin/bash в теле скрипта

Re: Глюк if скрипта при запуске через cron

Добавлено: 2012-10-10 13:14:45
kpp
mmvds
Как было в кронтабе до того?

Re: Глюк if скрипта при запуске через cron

Добавлено: 2012-10-10 13:51:47
mmvds
до того было просто /home/scripts/script.sh
точнее * * * * * /home/scripts/script.sh
стало * * * * * /usr/local/bin/bash /home/scripts/script.sh

Re: Глюк if скрипта при запуске через cron

Добавлено: 2012-10-10 13:54:08
kpp
Покажите первые 10 строк скрипта.

Re: Глюк if скрипта при запуске через cron

Добавлено: 2012-10-10 13:58:58
mmvds

Код: Выделить всё

#!/usr/local/bin/bash
dir=/home/scripts
cat /dev/null > $dir/tmp.txt
while IFS=: read host_name address ip_addr status
do
 res=`/usr/local/sbin/fping $ip_addr | grep -c alive`
 date_now=`date '+%Y-%m-%d %H:%M'`
#set -x 
 if [ $res -eq '1' ];
 then
.........

Re: Глюк if скрипта при запуске через cron

Добавлено: 2012-10-10 14:06:51
kpp
Эта строка самая первая, без отступов\пробелов?

Код: Выделить всё

#!/usr/local/bin/bash

Re: Глюк if скрипта при запуске через cron

Добавлено: 2012-10-10 14:15:13
mmvds
Да, проверял несколько раз, без отступов, пробелов и даже ^M на конце нет, хотя на этой машине FreeBSD 7.1, но по идее повлиять не должно было, на всех скриптах до этого всегда прописывал путь до интерпретатора аналогично и всегда работало, правда остальные машины на 8-ой версии фри и на linux'овых сборках. Больше на 7.1 ни одной нет, но не думаю что в этом проблема.
Кстати, м.б. правильнее делать сравнение в формате, который поймет даже стандартный shell?

Re: Глюк if скрипта при запуске через cron

Добавлено: 2012-10-10 14:22:50
kpp
Попробовать так:

Код: Выделить всё

if [ "$status" = 'DOWN' ]
В баше [ - сравнение строк "==", в sh - сравнение строк через "=".

Re: Глюк if скрипта при запуске через cron

Добавлено: 2012-10-10 14:29:55
kpp
Вернее в баше все равно: "==" или "=".
А для sh - только "=".

Re: Глюк if скрипта при запуске через cron

Добавлено: 2012-10-10 14:35:26
mmvds
спасибо!

Re: Глюк if скрипта при запуске через cron

Добавлено: 2012-10-10 14:41:41
kpp
Всегда пожалуйста.
Однако все равно неясно: почему при запуске из крона, для запуска стрипта стартует шелл по умолчанию, а не указанный в первой строке #!/....

Re: Глюк if скрипта при запуске через cron

Добавлено: 2012-10-10 15:25:59
Bayerische
Мне видится, что shebang игнорируется при запуске из другого файла, коим является crontab, а в качестве шелла используется текущий интерпретатор, в котором отрабатывается данный файл (crontab), т.е. sh.

Re: Глюк if скрипта при запуске через cron

Добавлено: 2012-10-11 9:32:49
mmvds
да, погуглил, действительно, Bayerische прав, в некоторых версиях freebsd и *nix замечено такое поведение cron
http://www.in-ulm.de/~mascheck/various/shebang/