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
...

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

★★
Ответ на: комментарий от dilmah

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

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

> что в директории присутствует файл "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 ★★★★★
()
Ответ на: комментарий от dilmah

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

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

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

test -r "строка"

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



test -r "строка"

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

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

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

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

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

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

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

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

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

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

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

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 ★★
() автор топика
Ответ на: комментарий от DDR

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

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

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

замени for на:

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

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

done





dilmah ★★★★★
()
Ответ на: комментарий от dilmah

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 ★★
() автор топика
Ответ на: комментарий от DDR

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

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

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

mky ★★★★★
()

телепаты вернулись из отпуска =) я там подправил проверку поскольку в этих файлах ошибка по другому выглядит =)
через 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
()
Ответ на: комментарий от bull-dog

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

ИМХО, имеет смысл завести переменную содержащую имя файла, допустим
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 ★★★★★
()

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

#переносим в другую директорию а т.к. не удаляются плохие файлы можно их просто не трогать
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
()

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

#!/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
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.