LINUX.ORG.RU

Скрипт


0

0

Приветствую, с написанием скриптов баш не имел дела раньше, а щас надо довольно срочно, помогите пожалуйста, проблема:
есть прога (на яве написана) запускается с 2мя ключами (например test a b), где а - с какой статьи начать качать, b - сколько статей.
Нужно запускать это прогу с параметрами a=1 , b=1000 (на второй итерации a=1001, потом 2001,3001,...). Но после каждого завершения программы (наверное нужно смотреть как процесс завершится) нужно проверить, что в директории присутствует файл "articles-"+a+"-"+b+"" и что в нем нет строки "error not found". Если есть такая строка или файл не так называеться удалить все файлы не подходящие под маску ("articles-"+a+"-"+b+"") и перезапустить прогу на скачку с темиже параметрами, если все правильно, то запустить прогу со след. парой параметров.
В итоге в директории должны лежать файлы:
articles-1-1000.xml
articles-1001-2000.xml
articles-2001-3000.xml
...

Заранее благодарю.

★★

Ответ на: Re: Скрипт от dilmah

Re: Скрипт

Большим вопросом является как проверить что процесс закончился, и как проверить название файла на маску?
(поиск еррор'а думаю можно сделать cet|grep -v).

DDR ★★ ()
Ответ на: Re: Скрипт от DDR

Re: Скрипт

> что в директории присутствует файл "articles-"+a+"-"+b+""

if test -r "articles-${FROM}-${TO}"; then
  присутствует
fi

> и что в нем нет строки "error not found".

if grep -v -q '^error not found$' "$MY_FILE"; then
  такой строки нет
fi

dilmah ★★★★★ ()
Ответ на: Re: Скрипт от dilmah

Re: Скрипт

Если Вам не сложно, не могли бы пояснить кусок кода:
if test -r "articles-${FROM}-${TO}"; then
присутствует
fi

Непонятно именно почему пишеться test -r "строка";

DDR ★★ ()
Ответ на: Re: Скрипт от DDR

Re: Скрипт

test -r "строка"

это программа test запущенная с параметрами -r "строка"



test -r "строка"

возвращает нулевой код возврата (успех) в том случае, если "строка" является файлом, доступным на чтение.

if команда; then
  ЧТОТО
fi

работает так, что ЧТОТО выполняется в том случае если команда возвращает успех.

dilmah ★★★★★ ()
Ответ на: Re: Скрипт от dilmah

Re: Скрипт

О, отлично! Спасибо, осталось разобраться как понять что оно скачалось (процесс завершен).

DDR ★★ ()
Ответ на: Re: Скрипт от DDR

Re: Скрипт

Об окончание проги наверное можно узнать так?
test a b &> /dev/null
if $; then
прога закончилась
else
ждем

Можно так?
А как ждать например 10 сек?

DDR ★★ ()
Ответ на: Re: Скрипт от dilmah

Re: Скрипт

Мне нужно делать проверки (на правильность названия и не содержания ошибок) после выполнения проги, а прога качает хмл файлы размером 5-10мб, т.е. выполняеться не моментально, вот надо сначало подождать пока она завершится, а потом проверить, что она скачала

DDR ★★ ()
Ответ на: Re: Скрипт от DDR

Re: Скрипт

если ты попал на вторую строку, то test a b уже завершился. Ты туда не попадешь пока не завершится.

dilmah ★★★★★ ()
Ответ на: Re: Скрипт от dilmah

Re: Скрипт

Тогда вообще отлично:) Спасибо огромное! Буду пробовать себя в скрипто-писание)))))

DDR ★★ ()
Ответ на: Re: Скрипт от DDR

Re: Скрипт

for IT in $(seq 0 5); do
java -jar ./bin/PubMedSaver.jar -retstart $((IT*1000+1)) -retmax 1000 > /dev/null
sleep 1
let fl=0
let fl1=0
#rm ./data/Articles-$((IT*1000+1))-$((IT*1000+1000)).xml написан для имитации бага
if java -jar ./bin/PubMedSaver.jar -r "./data/Articles-$((IT*1000+1))-$((IT*1000+1000)).xml"; then
let fl=1
echo fl=$fl
fi
echo IT=$IT
if grep -v -q '^XML not found for id.*' "./data/Articles-$((IT*1000+1))-$((IT*1000+1000)).xml"; then
let fl1=1
echo fl1=$fl1
fi
if [ "$fl" = "0" ]; then
let IT=IT-1
echo IT=$IT
elif [ "$fl1" = "1" ]; then
let IT=IT-1
echo IT=$IT
fi
done

Проблема в том что он как IT уменьшил, но когда идет через фор он его востанавливает в значение, т.е. первый проход ИТ=0, ошибка уменьшает ИТ, ИТ=-1, а на след. проходе ИТ=1. Как это исправить?

DDR ★★ ()
Ответ на: Re: Скрипт от DDR

Re: Скрипт

Чот видно поздно уже:) С тупил)))))))
Заменил фор на вайл, ща протещу скажу)

DDR ★★ ()
Ответ на: Re: Скрипт от DDR

Re: Скрипт

> Проблема в том что он как IT уменьшил, но когда идет через фор он его востанавливает

замени for на:

IT=-1
while true; do
  IT=$(($IT+1))
  if test $IT -gt 5; then
    break
  fi

  ....тут как прежде

done





dilmah ★★★★★ ()
Ответ на: Re: Скрипт от dilmah

Re: Скрипт

let IT=0
while [ $IT -lt 5 ];do
java -jar ./bin/PubMedSaver.jar -retstart $((IT*1000+1)) -retmax 1000 > /dev/null
sleep 1
let fl=0
let fl1=0
rm ./data/Articles-$((IT*1000+1))-$((IT*1000+1000)).xml
if java -jar ./bin/PubMedSaver.jar -r "./data/Articles-$((IT*1000+1))-$((IT*1000+1000)).xml"; then
let fl=1
echo fl=$fl
fi
echo IT=$IT
if grep -v -q '^XML not found for id.*' "./data/Articles-$((IT*1000+1))-$((IT*1000+1000)).xml"; then
let fl1=1
echo fl1=$fl1
fi
if [ "$fl" = "0" ]; then
let IT=IT-1
echo IT=$IT
elif [ "$fl1" = "1" ]; then
let IT=IT-1
echo IT=$IT
fi
let IT=IT+1
done

специально удаляю файлик скаченный, чтобы типо ошибка при скачке имитировалась, проблема в том, что что он начинает весь выхлоп тогда гнать в консоль а не в /дев/нул, и качать не по 1000, а по 10000, т.е. как будто строчка
java -jar ./bin/PubMedSaver.jar -retstart $((IT*1000+1)) -retmax 1000 > /dev/null
меняется на
java -jar ./bin/PubMedSaver.jar -retstart $((IT*1000+1)) -retmax 10000

DDR ★★ ()
Ответ на: Re: Скрипт от DDR

Re: Скрипт

Запустите ваш скрипт с ключём -x, то есть:

/bin/bash -x "ИМЯ_вашего_скрипта"

и перед запуском каждой команды bash будет печатать выполняемую команду на stderr. Можно перенаправить вывод в файл и потом внимательно почитать.

mky ★★★★★ ()

Re: Скрипт

телепаты вернулись из отпуска =) я там подправил проверку поскольку в этих файлах ошибка по другому выглядит =)
через test проверку не получилось сделать, сделал через grep
если есть пожелания по улучшению с радостью приму =)


#!/bin/sh
let IT=8096
while [ 1 ];do
java -jar ./bin/PubMedSaver.jar -retstart $((IT*1000+1)) -retmax 1000 > /dev/null
let fl1=0

if grep -q id ./data/Articles-$((IT*1000+1))-$((IT*1000+1000)).xml
then
        let fl=0
else
        let fl=1
fi

if grep -q 'XML not found for id' "./data/Articles-$((IT*1000+1))-$((IT*1000+1000)).xml";
then
        let fl1=1
fi

if [ "$fl" = "1" ]; then
        let IT=IT-1

fi
if [ "$fl1" = "1" ]; then
        let IT=IT-1
fi

let IT=IT+1
done

bull-dog ()
Ответ на: Re: Скрипт от bull-dog

Re: Скрипт

>пожелания по улучшению

ИМХО, имеет смысл завести переменную содержащую имя файла, допустим
OFILE=./data/Articles-$((IT*1000+1))-$((IT*1000+1000)).xml
чтобы не писать такие длинные операторы if.

grep'у можно добавить опицю -s, чтобы на экран не выводилось сообщения об ошибке, если файла нет.

И изменение переменной IT, ИМХО, слишком мудрёное. Может так
if [ "$fl" = "0" -a "$fl1" = "0" ] ; then
     let IT=IT+1
fi





mky ★★★★★ ()

Re: Скрипт

И чтобы было удобнее работать с большим количеством файлов приведу несколько строк:

#переносим в другую директорию а т.к. не удаляются плохие файлы можно их просто не трогать
mv ./data/Articles-*[0][0][0-9]-*[0][0][0].xml ./tmp/

#и удаляем мусор который генерируется =)
rm -f ./data/Links*
rm -f ./data/Ids*

#ещё можно удалить файлики которые скачались с ошибками

rm -f ./data/Articles-*[1-9][0-9][0-9]-*
rm -f ./data/Articles-*-*[1-9][0-9][0-9].xml

вешаем все это дело в крон и выполняем раз в сутки чтобы удалить лишний мусор =)

bull-dog ()

Re: Скрипт

спасибо за пожелания.
с учетом всех пожеланий получилось вот такое дело:

#!/bin/sh

let IT=9067
OFILE=./data/Articles-$((IT*1000+1))-$((IT*1000+1000)).xml

while [ 1 ];do
java -jar ./bin/PubMedSaver.jar -retstart $((IT*1000+1)) -retmax 1000 > /dev/null

if grep -q -s 'id' "$OFILE" ; then
        let fl=0
else
        let fl=1
fi

if grep -q -s 'XML not found for id' "$OFILE" ; then
        let fl1=1
else
        let fl1=0
fi

if [ "$fl" = "0" -a "$fl1" = "0" ] ; then
     let IT=IT+1
fi

done

bull-dog ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.