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

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
mmvds
мл. сержант
Сообщения: 92
Зарегистрирован: 2011-01-26 17:24:07

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

Непрочитанное сообщение mmvds » 2012-10-10 10:16:58

Всем привет! Есть часть скрипта:

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

 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 в скрипте тоже есть

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

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/


kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

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

Непрочитанное сообщение kpp » 2012-10-10 11:32:20

Перед этим блоком , после Весь вывод скрипта перенаправить в файл

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

/../script.sh > /var/log/test_script.log 2>&1
Проанализировать файл /var/log/test_script.log
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

mmvds
мл. сержант
Сообщения: 92
Зарегистрирован: 2011-01-26 17:24:07

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

Непрочитанное сообщение mmvds » 2012-10-10 12:09:57

Лог выглядит так

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

+ [ 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

mmvds
мл. сержант
Сообщения: 92
Зарегистрирован: 2011-01-26 17:24:07

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

Непрочитанное сообщение mmvds » 2012-10-10 12:16:50

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

mmvds
мл. сержант
Сообщения: 92
Зарегистрирован: 2011-01-26 17:24:07

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

Непрочитанное сообщение mmvds » 2012-10-10 12:28:18

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

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

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

Непрочитанное сообщение kpp » 2012-10-10 13:14:45

mmvds
Как было в кронтабе до того?
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

mmvds
мл. сержант
Сообщения: 92
Зарегистрирован: 2011-01-26 17:24:07

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

Непрочитанное сообщение mmvds » 2012-10-10 13:51:47

до того было просто /home/scripts/script.sh
точнее * * * * * /home/scripts/script.sh
стало * * * * * /usr/local/bin/bash /home/scripts/script.sh

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

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

Непрочитанное сообщение kpp » 2012-10-10 13:54:08

Покажите первые 10 строк скрипта.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

mmvds
мл. сержант
Сообщения: 92
Зарегистрирован: 2011-01-26 17:24:07

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

Непрочитанное сообщение mmvds » 2012-10-10 13:58:58

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

#!/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
.........

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

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

Непрочитанное сообщение kpp » 2012-10-10 14:06:51

Эта строка самая первая, без отступов\пробелов?

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

#!/usr/local/bin/bash
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

mmvds
мл. сержант
Сообщения: 92
Зарегистрирован: 2011-01-26 17:24:07

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

Непрочитанное сообщение mmvds » 2012-10-10 14:15:13

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

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

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

Непрочитанное сообщение kpp » 2012-10-10 14:22:50

Попробовать так:

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

if [ "$status" = 'DOWN' ]
В баше [ - сравнение строк "==", в sh - сравнение строк через "=".
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

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

Непрочитанное сообщение kpp » 2012-10-10 14:29:55

Вернее в баше все равно: "==" или "=".
А для sh - только "=".
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.


kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

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

Непрочитанное сообщение kpp » 2012-10-10 14:41:41

Всегда пожалуйста.
Однако все равно неясно: почему при запуске из крона, для запуска стрипта стартует шелл по умолчанию, а не указанный в первой строке #!/....
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Bayerische
капитан
Сообщения: 1820
Зарегистрирован: 2010-12-25 20:41:50
Откуда: Хлебная столица

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

Непрочитанное сообщение Bayerische » 2012-10-10 15:25:59

Мне видится, что shebang игнорируется при запуске из другого файла, коим является crontab, а в качестве шелла используется текущий интерпретатор, в котором отрабатывается данный файл (crontab), т.е. sh.

mmvds
мл. сержант
Сообщения: 92
Зарегистрирован: 2011-01-26 17:24:07

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

Непрочитанное сообщение mmvds » 2012-10-11 9:32:49

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