Выполнения скрипта в crone

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
bagas
лейтенант
Сообщения: 922
Зарегистрирован: 2010-08-18 19:49:01
Откуда: Воронеж
Контактная информация:

Выполнения скрипта в crone

Непрочитанное сообщение bagas » 2013-10-03 21:04:00

доброй ночи.
Подскажи пожалуйста почему мой скрипт не срабатывает в кроне нормально.
имеем скрипт парсинга файла.

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

cat /srv/blok_site/old/dump-2013-10-03.xml | grep -oe '\in.*\]' | sed "s|.*TA\[||; s/[]]]*$//"
если из консоле выполнить, выходит список большой доменов. команда отрабатывает нормально.
но если запустить скрипт с cat "${f}" | grep -oe "\in.*\]" | sed "s|.*TA\[||; s/[]]]*$//" | sort -u > /srv/blok_site/blok.dom через крон то от большого списка домены выходит толкьо один домен.
Сиситема centos,
скрипт на шеле.
часть скрипта.

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

#!/bin/sh
        for f in ${SOR};
do
                cat "${f}" | grep -oe "\in.*\]" | sed "s|.*TA\[||; s/[]]]*$//" | sort -u > /srv/blok_site/blok.dom
Думаю что то с переменными окружения.
Что бы ты не делал , жизнь слишком коротка!
Блог о BSD системах.

Хостинговая компания 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/

Аватара пользователя
bagas
лейтенант
Сообщения: 922
Зарегистрирован: 2010-08-18 19:49:01
Откуда: Воронеж
Контактная информация:

Re: Выполнения скрипта в crone

Непрочитанное сообщение bagas » 2013-10-03 21:40:04

попробовал полные пути указать программам, эффект тот же.
Что бы ты не делал , жизнь слишком коротка!
Блог о BSD системах.

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

Re: Выполнения скрипта в crone

Непрочитанное сообщение kpp » 2013-10-03 22:33:15

Возможно, дело в том, что при каждой итерации цикла файл /srv/blok_site/blok.dom перезаписывается.

Если из консоли запускаете

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

cat /srv/blok_site/old/dump-2013-10-03.xml | grep -oe '\in.*\]' | sed "s|.*TA\[||; s/[]]]*$//"
,
то и из крона нужно пробовать такой же скрипт запускать.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Аватара пользователя
bagas
лейтенант
Сообщения: 922
Зарегистрирован: 2010-08-18 19:49:01
Откуда: Воронеж
Контактная информация:

Re: Выполнения скрипта в crone

Непрочитанное сообщение bagas » 2013-10-04 8:21:51

А как он может перезаписываться если файл с цикла фор попадает в количестве одна штука.
Что бы ты не делал , жизнь слишком коротка!
Блог о BSD системах.

Аватара пользователя
skeletor
майор
Сообщения: 2548
Зарегистрирован: 2007-11-16 18:22:04

Re: Выполнения скрипта в crone

Непрочитанное сообщение skeletor » 2013-10-04 11:47:13

1) вместо

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

cat "${f}" | grep -oe "\in.*\]"
использовать

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

grep -oe "\in.*\]" "${f}"
и код короче и быстрее будет.
2) проблема явно с ${SOR}: цикл не знает, что это за переменная.

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

Re: Выполнения скрипта в crone

Непрочитанное сообщение kpp » 2013-10-04 11:56:08

skeletor писал(а):1) вместо

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

cat "${f}" | grep -oe "\in.*\]"
использовать

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

grep -oe "\in.*\]" "${f}"
и код короче и быстрее будет.
...
Короче - да, логичнее, но вот быстрее - под большим вопросом.
Сам проводил эксперименты.
Например

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

cat file | sed ...
оказалось быстрее чем

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

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

Аватара пользователя
bagas
лейтенант
Сообщения: 922
Зарегистрирован: 2010-08-18 19:49:01
Откуда: Воронеж
Контактная информация:

Re: Выполнения скрипта в crone

Непрочитанное сообщение bagas » 2013-10-04 12:01:41

skeletor писал(а):1) вместо

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

cat "${f}" | grep -oe "\in.*\]"
использовать

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

grep -oe "\in.*\]" "${f}"
и код короче и быстрее будет.
2) проблема явно с ${SOR}: цикл не знает, что это за переменная.
Если бы скрипт не понимал переменную сор, то он вообще бы не обрабатывал ее, а он ее обрабатывает, одина запись всетаки проскакиет же.
Что бы ты не делал , жизнь слишком коротка!
Блог о BSD системах.

Аватара пользователя
skeletor
майор
Сообщения: 2548
Зарегистрирован: 2007-11-16 18:22:04

Re: Выполнения скрипта в crone

Непрочитанное сообщение skeletor » 2013-10-04 12:23:04

kpp писал(а): Короче - да, логичнее, но вот быстрее - под большим вопросом.
Сам проводил эксперименты.
Например

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

cat file | sed ...
оказалось быстрее чем

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

 sed ... file
А можно результаты тестирования по времени?

Аватара пользователя
skeletor
майор
Сообщения: 2548
Зарегистрирован: 2007-11-16 18:22:04

Re: Выполнения скрипта в crone

Непрочитанное сообщение skeletor » 2013-10-04 12:28:12

bagas писал(а):
skeletor писал(а):1) вместо

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

cat "${f}" | grep -oe "\in.*\]"
использовать

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

grep -oe "\in.*\]" "${f}"
и код короче и быстрее будет.
2) проблема явно с ${SOR}: цикл не знает, что это за переменная.
Если бы скрипт не понимал переменную сор, то он вообще бы не обрабатывал ее, а он ее обрабатывает, одина запись всетаки проскакиет же.
Если не указать значение переменной, то shell может помещать в неё случайно значение либо 0 (зависит от ОС, шелла).
И вообще, как можно писать скрипт, надеясь, что переменная будет что-то содержать? Возможно она содержит значение от предыдущего выполнения этого скрипта? Или придудительно изменили её где-то в другом месте.

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

Re: Выполнения скрипта в crone

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

skeletor писал(а):
kpp писал(а): Короче - да, логичнее, но вот быстрее - под большим вопросом.
Сам проводил эксперименты.
Например

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

cat file | sed ...
оказалось быстрее чем

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

 sed ... file
А можно результаты тестирования по времени?
Да вы сами можете проверить.

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

time sed ... file
time cat file | sed ...
Конечно, на небольших файлах разницы особой не будет.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Аватара пользователя
bagas
лейтенант
Сообщения: 922
Зарегистрирован: 2010-08-18 19:49:01
Откуда: Воронеж
Контактная информация:

Re: Выполнения скрипта в crone

Непрочитанное сообщение bagas » 2013-10-04 13:52:56

вот лог выполнения цикла.

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

+ for f in '${SOR}'
+ cat /srv/blok_site/dump.xml
+ egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
+ sort -u
+ cat /srv/blok_site/dump.xml
+ /bin/grep -oe '\in.*\]'
+ /bin/sed 's|.*TA\[||; s/[]]]*$//'
+ /bin/sort -u
+ set +x
Как видно переменная SOR распознается верно.
Что бы ты не делал , жизнь слишком коротка!
Блог о BSD системах.

snorlov
подполковник
Сообщения: 3917
Зарегистрирован: 2008-09-04 11:51:25
Откуда: Санкт-Петербург

Re: Выполнения скрипта в crone

Непрочитанное сообщение snorlov » 2013-10-04 15:29:15

Вы делаете в цикле, а вывод у вас каждой строчки в файл, а не ДОПОЛНЕНИЕ файла

Аватара пользователя
bagas
лейтенант
Сообщения: 922
Зарегистрирован: 2010-08-18 19:49:01
Откуда: Воронеж
Контактная информация:

Re: Выполнения скрипта в crone

Непрочитанное сообщение bagas » 2013-10-04 19:00:09

snorlov писал(а):Вы делаете в цикле, а вывод у вас каждой строчки в файл, а не ДОПОЛНЕНИЕ файла
Это лог выполнения, это не сама команда.
Что бы ты не делал , жизнь слишком коротка!
Блог о BSD системах.

Аватара пользователя
bagas
лейтенант
Сообщения: 922
Зарегистрирован: 2010-08-18 19:49:01
Откуда: Воронеж
Контактная информация:

Re: Выполнения скрипта в crone

Непрочитанное сообщение bagas » 2013-10-04 19:31:01

Добавил к скрипту переменную

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

IFS="\$\t\n"
теперь скрипт видно что ругается.

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

+ BASH=/bin/sh
+ IFS='$\t\n'
+ INPUTRC=/etc/inputrc
+ LANG=en_US.UTF-8
+ PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin
+ SHELL=/bin/bash
+ SHLVL=1
+ TERM=xterm
++ ls /srv/blok_site/dump.xml
+ SOR=/srv/blok_site/dump.xml
+ DIS=/srv/blok_site/blok
+ OLD=/srv/blok_site/old
++ date +%Y-%m-%d
+ DATE=2013-10-04
+ '[' /srv/blok_site/dump.xml '!=' '' ']'
+ for f in '${SOR}'
+ cat /srv/blok_si
+ grep -oe '\in.*\]'
cat: /srv/blok_si: No such file or directory
+ sed 's|.*TA\[||; s/[]\]\]*$//'
+ sort -u
+ for f in '${SOR}'
+ cat e/dump.xml
cat: e/dump.xml: No such file or directory
+ grep -oe '\in.*\]'
+ sed 's|.*TA\[||; s/[]\]\]*$//'
+ sort -u
Что бы ты не делал , жизнь слишком коротка!
Блог о BSD системах.

lazhu
сержант
Сообщения: 241
Зарегистрирован: 2013-08-10 14:28:38
Контактная информация:

Re: Выполнения скрипта в crone

Непрочитанное сообщение lazhu » 2013-10-04 23:58:50

#!/bin/sh
for f in ${SOR};
do
cat "${f}" | grep -oe "\in.*\]" | sed "s|.*TA\[||; s/[]]]*$//" | sort -u > /srv/blok_site/blok.dom
Вам же сказали, что при каждой итерации вы перезаписываете весь файл.

Аватара пользователя
bagas
лейтенант
Сообщения: 922
Зарегистрирован: 2010-08-18 19:49:01
Откуда: Воронеж
Контактная информация:

Re: Выполнения скрипта в crone

Непрочитанное сообщение bagas » 2013-10-05 9:22:56

lazhu писал(а):
#!/bin/sh
for f in ${SOR};
do
cat "${f}" | grep -oe "\in.*\]" | sed "s|.*TA\[||; s/[]]]*$//" | sort -u > /srv/blok_site/blok.dom
Вам же сказали, что при каждой итерации вы перезаписываете весь файл.
Нет!!!!!
Я пробовал и без цикла, также получается.
Что бы ты не делал , жизнь слишком коротка!
Блог о BSD системах.

snorlov
подполковник
Сообщения: 3917
Зарегистрирован: 2008-09-04 11:51:25
Откуда: Санкт-Петербург

Re: Выполнения скрипта в crone

Непрочитанное сообщение snorlov » 2013-10-06 18:16:02

Вспомним, что в первом посте
bagas писал(а):д

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

cat /srv/blok_site/old/dump-2013-10-03.xml | grep -oe '\in.*\]' | sed "s|.*TA\[||; s/[]]]*$//"
если из консоле выполнить, выходит список большой доменов. команда отрабатывает нормально.
но если запустить скрипт с cat "${f}" | grep -oe "\in.*\]" | sed "s|.*TA\[||; s/[]]]*$//" | sort -u > /srv/blok_site/blok.dom через крон то от большого списка домены выходит толкьо один домен.

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

#!/bin/sh
        for f in ${SOR};
do
                cat "${f}" | grep -oe "\in.*\]" | sed "s|.*TA\[||; s/[]]]*$//" | sort -u > /srv/blok_site/blok.dom
Вы отвергли предположение, что переменная SOR не определена и перезапись файла в цикле...
По поводу последнего... попробуйте
code]#!/bin/sh
echo > /srv/blok_site/blok.dom
for f in ${SOR};
do cat "${f}" | grep -oe "\in.*\]" | sed "s|.*TA\[||; s/[]]]*$//" | sort -u >> /srv/blok_site/blok.dom[/code]
[/quote]

Аватара пользователя
bagas
лейтенант
Сообщения: 922
Зарегистрирован: 2010-08-18 19:49:01
Откуда: Воронеж
Контактная информация:

Re: Выполнения скрипта в crone

Непрочитанное сообщение bagas » 2013-10-06 18:27:24

Да уже решил задачу, запустил все хозяйство минуя крон, из консоли в вечном цикле с засыпанием на 23часа.
Полет нормальный.
Спасибо всем откликнувшимся, что не оставили в трудную минуту.
Идею насчет не убиваемого скрипта подал знакомый прогер KPP777
Что бы ты не делал , жизнь слишком коротка!
Блог о BSD системах.