ВидеоКонф(ВКС)  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

Не работает mysql-запрос в скрипте вызываемом cron'ом

Общие вопросы по операционной системе

Модераторы: april22, Zavr2008

Не работает mysql-запрос в скрипте вызываемом cron'ом

Сообщение SolarW » 07 май 2012, 09:43

Продолжаю пилить скрипт запроса баланса GSM-модемов.
Благодаря помощи оказанной на форуме разобрался с парсингом данных, добился того, что скрипт запускаемый из командной строки работает нормально.
Вставил запуск его в cron и получил облом.
Скрипт работает но не на все сто процентов.
Балансы запрашиваются, полученный данные парсятся нормально и в базу заносятся.
Не работают sql-запросы делающие выборку данных из базы и записывающие результаты в текстовые файлы чтобы можно было видеть результаты через веб.
Вот такой запрос работает нормально
Код: выделить все
# Заполняем базу значениями
mysql -u$dbuser -p$dbpass -D $dbname -e "INSERT INTO ${tbname} (md5,port,balans,time) values ('$mdha' , '$modnumr' , '$balance' , '$baldate');" >/dev/null

а вот такой
Код: выделить все
mysql -u$dbuser -p$dbpass -D $dbname -e "\
set @a=0.0;select port as 'Модем',time as 'Дата Время',balans as 'Баланс',if(delta>0 and balans<>delta,delta,'-') as 'Приход',if(delta<0,delta,'-') as 'Расход' \
from(select * from (select port,time,balans,round(balans-pv_balans,2) as delta \
from(select port,time,@a as pv_balans,@a:=balans,balans \
from ${tbname} where port='${num}' order by time) as t1) as t2 where delta<>0) as t3;" | column -t >> $repath/bal-$num.txt

и такой
Код: выделить все
# Создаем сводный отчет по текущим балансам
zapr="select port as 'Модем',balans as 'Баланс',time as 'Дата Время' \
from (select * from (select max(time) as last_date,port as prt \
from ${tbname} group by port) as tbl1 \
JOIN ${tbname} where tbl1.last_date=${tbname}.time and tbl1.prt=${tbname}.port) as itog where port<>'' order by port;"

mysql -u$dbuser -p$dbpass -D $dbname -e "${zapr}" | column -t > $repath/balans_ob.txt

ничего в файл не выводят.
И что самое противное во втором скрипте из набора (который проверяет не опустился ли баланс ниже определенного значения) есть очень похожий запрос
Код: выделить все
# Создаем сводный отчет по низким балансам

zapr="select port as 'Модем',balans as 'Баланс',time as 'Дата Время' \
from (select * from (select max(time) as last_date,port as prt \
from ${tbname} group by port) as tbl1 \
JOIN ${tbname} where tbl1.last_date=${tbname}.time and tbl1.prt=${tbname}.port) as itog where port<>'' and balans<'${porog}' order by port;"
mysql -u$dbuser -p$dbpass -D $dbname -e "${zapr}" | column -t > emltmp

и он запущенный cron'ом отрабатывается нормально...

Система CentOS 5.8 (Elastix 2.3 с последними обновлениями)
Скрипт запускается от root'а.
Гугления результата не дало.
Практически во всех случаях подобная проблема была вызвана тем, что для заданий запускаемых cron'ом переменная PATH отличалась от этой же переменной в командной строке.
Посмотрел содержимое переменной в командной строке, прописал такую же в /etc/crontab - не помогло.
Прописал в скрипте вызов команды mysql с полным путем - тоже не помогло.
В /var/log/cron ничего интересного нет.
В почте root'а куда падают отчеты о выполнении заданий тоже ничего интересного.
Прописывание запуска скрипта в кронтабе с выводом результатов в > /tmp/script.log тоже не диагностировало проблему.
Нашел в инете упоминание о подобной проблеме
http://forum.sysadmins.su/index.php?showtopic=3516
но решения там не приводится.
Аватар пользователя
SolarW
 
Сообщений: 1331
Зарегистрирован: 01 сен 2010, 14:21
Откуда: Днепропетровск, Украина

Re: Не работает mysql-запрос в скрипте вызываемом cron'ом

Сообщение Vlad1983 » 07 май 2012, 09:59

chmod 777 /var/www/bal

накой в файлы писать когда можно сразу из БД читать?
Последний раз редактировалось Vlad1983 07 май 2012, 10:02, всего редактировалось 1 раз.
ЛС: @rostel
Vlad1983
 
Сообщений: 4251
Зарегистрирован: 09 авг 2011, 11:51

Re: Не работает mysql-запрос в скрипте вызываемом cron'ом

Сообщение Sfinx » 07 май 2012, 10:02

zapr="select port as 'Модем',balans as 'Баланс',time as 'Дата Время' \
from (select * from (select max(time) as last_date,port as prt \
from ...


Явная синтаксическая ошибка - 2 from. Следует перед вставкой SQL'а в крон запустить/отладить его из монитора.

P.S. Да, и 2>&1 > cron_script.log позволит увидеть stderr сообщения об ошибках, которых судя по всему сейчас не видно. Ну про проверку shell return code монитора я вообще молчу.
Rus

-----------
SfinxSoft
http://sfinxsoft.com
Аватар пользователя
Sfinx
 
Сообщений: 672
Зарегистрирован: 21 июн 2011, 23:40
Откуда: Odessa

Re: Не работает mysql-запрос в скрипте вызываемом cron'ом

Сообщение SolarW » 07 май 2012, 10:29

Vlad1983 писал(а):chmod 777 /var/www/bal

Попробую но вряд ли дело в этом - в обоих случаях скрипт запускается от рута.
Vlad1983 писал(а):накой в файлы писать когда можно сразу из БД читать?

Это к автору скрипта скорее всего вопрос - может он знает язык sql-запросов и баш-скриптинг но не знает php?
Sfinx писал(а):Явная синтаксическая ошибка - 2 from. Следует перед вставкой SQL'а в крон запустить/отладить его из монитора.

Ху из монитор?
Просто запускаемый из командной строки скрипт работает нормально, без ругани на синтаксические ошибки.
Аватар пользователя
SolarW
 
Сообщений: 1331
Зарегистрирован: 01 сен 2010, 14:21
Откуда: Днепропетровск, Украина

Re: Не работает mysql-запрос в скрипте вызываемом cron'ом

Сообщение SolarW » 07 май 2012, 10:32

Ошибки кстати выдает как раз рабочая часть скрипта - та, что информацию в базу заносит.
Код: выделить все
ERROR 1062 (23000) at line 1: Duplicate entry '68b329da9893e34099c7d8ad5cb9c940' for key 1
ERROR 1062 (23000) at line 1: Duplicate entry '1c94db1792b72bf1f59abea848ae6acc' for key 1
ERROR 1062 (23000) at line 1: Duplicate entry 'a249ed0b50c813f3a01bdd7359ab53b1' for key 1
ERROR 1062 (23000) at line 1: Duplicate entry 'be069879d1e3b9b4e4dd610ee8aab366' for key 1
ERROR 1062 (23000) at line 1: Duplicate entry '8ffc5a4099b2b76ad064efe9cc4190ef' for key 1
ERROR 1062 (23000) at line 1: Duplicate entry 'a7c62a813aab2692ec42e40fc680fd6d' for key 1
ERROR 1062 (23000) at line 1: Duplicate entry 'a9b07ff3cb3f561d0998f4ad80884a06' for key 1
ERROR 1062 (23000) at line 1: Duplicate entry '01d937db475a73091edcc93ef854954c' for key 1
ERROR 1062 (23000) at line 1: Duplicate entry 'dff6fce831f7d05019e9a42faf6eed3b' for key 1
ERROR 1062 (23000) at line 1: Duplicate entry '4a6fffebe3f4c17fbe743796ce908143' for key 1
ERROR 1062 (23000) at line 1: Duplicate entry 'f01816b0d5769ef80cc955c3b36aba8a' for key 1
ERROR 1062 (23000) at line 1: Duplicate entry '55d498c8232908d42b7a50bef6024a45' for key 1
ERROR 1062 (23000) at line 1: Duplicate entry '5686837c43490c706990124a030421b0' for key 1
ERROR 1062 (23000) at line 1: Duplicate entry '5eb949da0feeb2c9f91b689edd700f17' for key 1
ERROR 1062 (23000) at line 1: Duplicate entry '476813d9a83b8039c61132c038e02e46' for key 1
ERROR 1062 (23000) at line 1: Duplicate entry '4367931eeb4f6d4063c71d8b91e3dcd7' for key 1

Но тем не менее - работает.
Аватар пользователя
SolarW
 
Сообщений: 1331
Зарегистрирован: 01 сен 2010, 14:21
Откуда: Днепропетровск, Украина

Re: Не работает mysql-запрос в скрипте вызываемом cron'ом

Сообщение Sfinx » 07 май 2012, 10:50

Ху из монитор?


SQL монитором называется db command line client.

Просто запускаемый из командной строки скрипт работает нормально, без ругани на синтаксические ошибки.


Oops, я вторую скобку не заметил ;)
Rus

-----------
SfinxSoft
http://sfinxsoft.com
Аватар пользователя
Sfinx
 
Сообщений: 672
Зарегистрирован: 21 июн 2011, 23:40
Откуда: Odessa

Re: Не работает mysql-запрос в скрипте вызываемом cron'ом

Сообщение SolarW » 07 май 2012, 12:18

Sfinx писал(а):SQL монитором называется db command line client.

Прогнал проблемные запросы из командной строки заменив переменные на их значения.
Код: выделить все
[root@pbx ~]# /usr/bin/mysql -uuser -ppassword -D asteriskcdrdb -e "\
>  set @a=0.0;select port as 'Модем',time as 'Дата Время',balans as 'Баланс',if(delta>0 and balans<>delta,delta,'-') as 'Приход',if(delta<0,delta,'-') as 'Расход' \
>  from(select * from (select port,time,balans,round(balans-pv_balans,2) as delta \
>  from(select port,time,@a as pv_balans,@a:=balans,balans \
>  from gsmbalans where port='dongle1' order by time) as t1) as t2 where delta<>0) as t3;" | column -t
Модем    Дата        Время     Баланс  Приход  Расход
dongle1  2012-05-05  22:09:10  145.97  -       -
dongle1  2012-05-07  09:17:14  145.76  -       -0.21
dongle1  2012-05-07  10:30:08  145.33  -       -0.43

Код: выделить все
[root@pbx ~]# /usr/bin/mysql -uuser -ppassword -D asteriskcdrdb -e "\
>  select port as 'Модем',balans as 'Баланс',time as 'Дата Время' \
>  from (select * from (select max(time) as last_date,port as prt \
>  from gsmbalans group by port) as tbl1 \
>  JOIN gsmbalans where tbl1.last_date=gsmbalans.time and tbl1.prt=gsmbalans.port) as itog where port<>'' order by port;"
+------------+--------------+---------------------+
| Модем      | Баланс       | Дата Время          |
+------------+--------------+---------------------+
| dongle1    |       145.33 | 2012-05-07 10:56:24 |
| dongle2    |       138.70 | 2012-05-07 10:56:39 |
| dongle3    |         7.81 | 2012-05-07 10:56:40 |
| dongle4    |        11.87 | 2012-05-07 10:56:26 |
+------------+--------------+---------------------+

Работают что красавцы.
switch писал(а):SolarW, освой перл или пхп, пиши такие вещи там.

Если бы у меня на это в этой жизни было время - я бы с радостью :-)
switch писал(а):Плюс научись общепринятому форматированию SQL синтаксиса.
Ну и три вложенных селекта это эпично.

Повторюсь, это не мое - пытаюсь адаптировать вот человеком написанное
Я от языка sql-запросов примерно на таком же расстоянии как и от php. :-)
Из языков программирования немножко в башскриптинге только понимаю (могу сообразить что обозначает написанное другими).
Ну и html примерно на таком же уровне :-)
Аватар пользователя
SolarW
 
Сообщений: 1331
Зарегистрирован: 01 сен 2010, 14:21
Откуда: Днепропетровск, Украина

Re: Не работает mysql-запрос в скрипте вызываемом cron'ом

Сообщение Sfinx » 08 май 2012, 08:20

А последовать моему второму совету ? Также не помешает вставка отладочной печати дабы убедиться что все переменные в скрипте ресолвятся верно.
Rus

-----------
SfinxSoft
http://sfinxsoft.com
Аватар пользователя
Sfinx
 
Сообщений: 672
Зарегистрирован: 21 июн 2011, 23:40
Откуда: Odessa

Re: Не работает mysql-запрос в скрипте вызываемом cron'ом

Сообщение SolarW » 08 май 2012, 10:11

Sfinx писал(а):А последовать моему второму совету ?

Да я бы с радостью,
Sfinx писал(а):Да, и 2>&1 > cron_script.log позволит увидеть stderr сообщения об ошибках, которых судя по всему сейчас не видно.

если бы понял что это значит :-)
Sfinx писал(а):Ну про проверку shell return code монитора я вообще молчу.

Учитывая что ручной запуск выполняется без ошибок что-то у меня сомнения в необходимости анализа кодов возврата.
Sfinx писал(а):Также не помешает вставка отладочной печати дабы убедиться что все переменные в скрипте ресолвятся верно.

Перед выполнением запроса через echo вывести переменные передающиеся запросу? Попробую но думаю что если бы они неправильно передавались mysql при запуске ругался бы какими-нибудь ошибками типа неправильный пароль или база данных...
Аватар пользователя
SolarW
 
Сообщений: 1331
Зарегистрирован: 01 сен 2010, 14:21
Откуда: Днепропетровск, Украина

Re: Не работает mysql-запрос в скрипте вызываемом cron'ом

Сообщение Samael28 » 08 май 2012, 12:22

SolarW писал(а): Да, и 2>&1 > cron_script.log позволит увидеть stderr сообщения об ошибках, которых судя по всему сейчас не видно.


если бы понял что это значит :-)

Перенаправить поток вывода и ошибок в файл cron_script.log.
Мой профайл на Upwork
Samael28
 
Сообщений: 1057
Зарегистрирован: 08 янв 2011, 19:32
Откуда: Киев

След.

Вернуться в Linux

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10

cron
© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH