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

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

Добавлено: 2013-10-03 21:04:00
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 через крон то от большого списка домены выходит толкьо один домен.
Сиситема centos,
скрипт на шеле.
часть скрипта.

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

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

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

Добавлено: 2013-10-03 21:40:04
bagas
попробовал полные пути указать программам, эффект тот же.

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

Добавлено: 2013-10-03 22:33:15
kpp
Возможно, дело в том, что при каждой итерации цикла файл /srv/blok_site/blok.dom перезаписывается.

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

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

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

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

Добавлено: 2013-10-04 8:21:51
bagas
А как он может перезаписываться если файл с цикла фор попадает в количестве одна штука.

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

Добавлено: 2013-10-04 11:47:13
skeletor
1) вместо

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

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

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

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

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

Добавлено: 2013-10-04 11:56:08
kpp
skeletor писал(а):1) вместо

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

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

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

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

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

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

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

 sed ... file

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

Добавлено: 2013-10-04 12:01:41
bagas
skeletor писал(а):1) вместо

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 2013-10-04 12:28:12
skeletor
bagas писал(а):
skeletor писал(а):1) вместо

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

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

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

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

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

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

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

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

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

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

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

time sed ... file
time cat file | sed ...
Конечно, на небольших файлах разницы особой не будет.

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

Добавлено: 2013-10-04 13:52:56
bagas
вот лог выполнения цикла.

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

+ 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 распознается верно.

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

Добавлено: 2013-10-04 15:29:15
snorlov
Вы делаете в цикле, а вывод у вас каждой строчки в файл, а не ДОПОЛНЕНИЕ файла

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

Добавлено: 2013-10-04 19:00:09
bagas
snorlov писал(а):Вы делаете в цикле, а вывод у вас каждой строчки в файл, а не ДОПОЛНЕНИЕ файла
Это лог выполнения, это не сама команда.

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

Добавлено: 2013-10-04 19:31:01
bagas
Добавил к скрипту переменную

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

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

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

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

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

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

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

Добавлено: 2013-10-06 18:16:02
snorlov
Вспомним, что в первом посте
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]

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

Добавлено: 2013-10-06 18:27:24
bagas
Да уже решил задачу, запустил все хозяйство минуя крон, из консоли в вечном цикле с засыпанием на 23часа.
Полет нормальный.
Спасибо всем откликнувшимся, что не оставили в трудную минуту.
Идею насчет не убиваемого скрипта подал знакомый прогер KPP777