powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Погогите новичку с шел-скриптом
25 сообщений из 27, страница 1 из 2
Погогите новичку с шел-скриптом
    #32880382
dummy_dub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Итак... ОС Solaris. Ведется лог-файл. Могучая кучка юзеров скидывает туда по строчке текста время от времени.
Задача: закачивать лог в базу оракл с целью обработки статистики.
Хотелось бы каждую новую строчку лога скидывать сразу. Могу предположить что для этого нужно использовать tail -f. Далее строчка должна передаваться скрипту который делает закачку в базу.

Меня интересует как передать каждую новую строчку от tail -f скрипту закачки в качестве параметра?

Заранее благодарен за Ваши ответы.
...
Рейтинг: 0 / 0
Погогите новичку с шел-скриптом
    #32880487
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
#!/bin/sh

tail -f test.txt |
while read i
do
 ./script.sh "$i"
done

типа того...
...
Рейтинг: 0 / 0
Погогите новичку с шел-скриптом
    #32881271
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работоспособно, но не очень красиво - я, думаю так лучше


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
FILELN= 0 
FILELOG=test.log

while :
do
    CUR_FILELN=`wc -l $FILELOG | awk '{print $1}'`
    if [ $FILELN -ne $CUR_FILELN ]; then
         TAIL_CNT=`expr $CUR_FILELN - $FILELN`
          exec  7 <& 0  < tail -$TAIL_CNT $FILELOG
          while :
          do
                read CUR_LINE
                if [ $? -ne  0  ]; then
                    break;
                fi
                ./load_line_to_db.sh $CUR_LINE  
          done
          FILELN=$CUR_FILELN
          exec <& 7  
    else
         sleep  5 
    fi
done

Возможны ощибки - не проверял. Но идея така...
...
Рейтинг: 0 / 0
Погогите новичку с шел-скриптом
    #32883547
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
74bytes
#!/bin/sh

tail -f test.txt |
while read i
do
./script.sh "$i"
done

541bytes
FILELN=0
FILELOG=test.log

while :
do
CUR_FILELN=`wc -l $FILELOG | awk '{print $1}'`
if [ $FILELN -ne $CUR_FILELN ]; then
TAIL_CNT=`expr $CUR_FILELN - $FILELN`
exec 7<&0 < tail -$TAIL_CNT $FILELOG
while :
do
read CUR_LINE
if [ $? -ne 0 ]; then
break;
fi
./load_line_to_db.sh $CUR_LINE
done
FILELN=$CUR_FILELN
exec <&7
else
sleep 5
fi
done

Красота требует жертв...)
...
Рейтинг: 0 / 0
Погогите новичку с шел-скриптом
    #32883937
и еще...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
при каждой итерации порождается процессов (при использовании sh):

в первом случае - 1

во втором случае - 8

:-)
...
Рейтинг: 0 / 0
Погогите новичку с шел-скриптом
    #32885946
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Продолжая о красоте. Что для меня _не_красиво_ это tail -f

1) tail -f при первом вызове выдает какое-то определенное количество строк (так где-то с 10), что не плохо бы обработать
2) tail -f _спит_ 1 секунду. Что не всегда приемлемо (может и не надо спать вообще, а может надо спать 10 минут. Как следсвие, скрипт (который грузит строчки) может просто не успеть за tail -f. В моем подходе такую ситуацию можно отпахать.

Ну а так, все работает, конечно, я ничего против не имею, не красиво тольки...
...
Рейтинг: 0 / 0
Погогите новичку с шел-скриптом
    #32885951
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще, неточность (на мой скромный взгляд)

Взглянем на

Код: plaintext
1.
2.
3.
4.
while read i
do
...
done

И за 1 сек ни одной новой строчки. Цикл, заверщился, скрипт умер.
А потом повалило, повалило ... и все мимо.
...
Рейтинг: 0 / 0
Погогите новичку с шел-скриптом
    #32886066
sanek842
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrushokИ еще, неточность (на мой скромный взгляд)
...
И за 1 сек ни одной новой строчки. Цикл, заверщился, скрипт умер.
А потом повалило, повалило ... и все мимо.
вообще-то все тут ОК, цикл просто так незавершается пока не нажмешь Cntrl C
Однако, хочу вам предложить более правильный путь
Будем писать скрипт, который можно будет вставить в cron, кот. будет выполняться с заданной периодичностью. Его можно будет запустить в любой момент вручную, или если хочешь вообще его вставить в цикл ....

Обрабатываемый файл
Код: plaintext
1.
2.
3.
4.
5.
[root@stat test]# cat test.txt
Строка  1 
Строка  2 
Строка  3 
Строка  4 

скрипт
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
[root@stat test]# cat s.sh
#!/bin/bash
[ -f new_rows.dat ] && {
echo скрипт в работе - выходим
exit
}
[ -f old_rows.dat ] || touch old_rows.dat
# compare two sorted files line by line and suppress lines that appear in both files ( man comm )
comm - 3  test.txt old_rows.dat >new_rows.dat
if [ -s new_rows.dat ]
 then
  echo Обрабатываем строки из new_rows.dat; cat new_rows.dat
  cat new_rows.dat >>old_rows.dat # пополняем файл обработанных строк
 else
  echo нет строк новых для обработки
fi
rm new_rows.dat

Замечание :
вам самостоятельно нужно еще будет предусмотреть действия в случае ошибок вашего скрипта по вставке в базу! Анализируй код завершения..

Успехов

;)
...
Рейтинг: 0 / 0
Погогите новичку с шел-скриптом
    #32886144
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
о, насчет количества строк - это легко можно изменить :)

tail -n1 -f test.txt

По производительности - у нас tail успевал за весьма интенсивным логом,
записи не терялись. Как раз shell скрипты с порождением множетва подпроцессов обычно тормозят, ибо помногу fork()-ают на каждую запись.

Конечно, можно много придумать, но tail - это стандартное решение.
Часто скрипт надо написать просто быстро и "на коленке" (обычно пишущий такие скрипты - админ и ему уже надо куда-то бежать чего-то конфигурить :-))

"настоящий программист" вообще бы на С написал это наверное :-)

P.S. "Пусть расцветают все цветы" - Мао Цзе Дун.
...
Рейтинг: 0 / 0
Погогите новичку с шел-скриптом
    #32888173
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не admin, хотя абсолютно согласен, что для админа tail -f достаточно. Я обычно скриптики клиентам передаю, так что там все тики-тики должно быть. Вредные клиенты иногда попадаются...
В данном примере, проблема не в том что tail не успеет, он всегда (почти) успеет. Проблема в том, что загрузчик может не успеть за tail. Хотя на 95% случаев сойдет и _не_красиво_...
...
Рейтинг: 0 / 0
Погогите новичку с шел-скриптом
    #32888175
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Санек,
Я уважаю bash (всегда себе его ставлю), но скриптики все же на sh предпочитаю ваять...
...
Рейтинг: 0 / 0
Погогите новичку с шел-скриптом
    #32888322
sanek842
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrushokЯ уважаю bash (всегда себе его ставлю), но скриптики все же на sh предпочитаю ваять...
а это не один xрeн?
Код: plaintext
1.
2.
# ls -l /bin/sh
lrwxrwxrwx   1  root root  4  Янв  12   10 : 36  /bin/sh -> bash
...
Рейтинг: 0 / 0
Погогите новичку с шел-скриптом
    #32888333
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не один, а два. И не хрен, а ракушка. Shell то бишь =). А чо у Вас там наверчено, я за то не в ответе...
...
Рейтинг: 0 / 0
Погогите новичку с шел-скриптом
    #32888441
Фотография lissyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если на другой машине понадобиться скрипт запускать?
Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Погогите новичку с шел-скриптом
    #32888486
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторlrwxrwxrwx 1 root root 4 Янв 12 10:36 /bin/sh -> bash
Так только в линухе. Автор вопроса работает в Solaris, для нее bash только дополнительно ставится, из пакетов. А в 2.6 и в пакетах вроде не было, тока скомпилять.
Не случайно скрипты всегда на sh.


2andrushok:

а как загрузчик может не успеть за tail???
Насколько я в курсе, как работает tail, такого не может произойти.
А если не успеет - в чем, по Вашему, это выразится?
tail проглотит пустую строку?
Но tail смотрит именно на последнбб строку.
Насколько я понимаю, tail просто все время читает файл, делая холостой lseek в цикле. (во всяком случае так на сях реализуется). В таком случае это невозможно.
...
Рейтинг: 0 / 0
Погогите новичку с шел-скриптом
    #32888500
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--null-- авторlrwxrwxrwx 1 root root 4 Янв 12 10:36 /bin/sh -> bash
Так только в линухе. Автор вопроса работает в Solaris, для нее bash только дополнительно ставится, из пакетов. А в 2.6 и в пакетах вроде не было, тока скомпилять.
Не случайно скрипты всегда на sh.

Хорошо бы, если б всегда, но в последнее время всё больше появляется умельцев, уверенных, что sh -- это тот же bash, а потому .sh скрипты должны содержать первой строкой #!/bin/bash... (
...
Рейтинг: 0 / 0
Погогите новичку с шел-скриптом
    #32888525
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DocAl несомненно, я имел в виду системные скрипты и поставляемые с нормальным software ;-)

Наверное, внутренний самопал можно на чем угодно делать, если не лень везде поддерживать одну и ту же версию оболочек.
У нас был зоопарк: RedHat, SCO Open Server и Solaris8, мы везде ставили bash, но только для удобства интерактивной работы пользователей, а скрипты писать - было железное правило - если shell, то sh, если awk - то обычный awk и т.д. Зато не теряли времени при переносе.
...
Рейтинг: 0 / 0
Погогите новичку с шел-скриптом
    #32888806
Somebody2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
--null--DocAl
У нас был зоопарк: RedHat, SCO Open Server и Solaris8, мы везде ставили bash, но только для удобства интерактивной работы пользователей, а скрипты писать - было железное правило - если shell, то sh, если awk - то обычный awk и т.д. Зато не теряли времени при переносе.

Ну если bash поставляется со всем этим зоопарком, то проблем с совместимостью быть не должно А возможностей у башика все ж таки поболее чем у стандартного sh.
...
Рейтинг: 0 / 0
Погогите новичку с шел-скриптом
    #32890291
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Нулевой
Может Вы и правы, проверять лень. Просто мне лично не нравиться tail -f, вот и все. Как кому-нить голубой цвет не нравится (а кому то нравится, однако).

А по поводу шелов всяких, у нас до сих пор солярка с 2.6 стоит. И кады клиенту пишещь - тольки на sh - железное правило. И grep, и awk тольки стандартные... Чо касается и gzip, unzip тоже ни - ни. Вот compress, uncompress - пожелте.
...
Рейтинг: 0 / 0
Погогите новичку с шел-скриптом
    #32890303
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Второй Кой-какой в Теле (Толстый, наверно)

А каки таки возможности у башика крутые, шо низя через sh реализовать. Я пока токи знаю

для bash
Код: plaintext
1.
export SOMEBODY2=fat

для sh
Код: plaintext
1.
2.
SOMEBODY2=fat
export SOMEBODY2

Ну дык переживем, как-нить. Чо-нить ще есть?
Я не имею ввиду некие различия в синтаксисе, но если если Вы считаете ЭТО КРУТО (в синтасисе) - приведите примеры пожалста...
...
Рейтинг: 0 / 0
Погогите новичку с шел-скриптом
    #32890327
Somebody2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrushok2 Второй Кой-какой в Теле (Толстый, наверно)

А каки таки возможности у башика крутые, шо низя через sh реализовать. Я пока токи знаю

для bash
Код: plaintext
1.
export SOMEBODY2=fat

для sh
Код: plaintext
1.
2.
SOMEBODY2=fat
export SOMEBODY2

Ну дык переживем, как-нить. Чо-нить ще есть?
Я не имею ввиду некие различия в синтаксисе, но если если Вы считаете ЭТО КРУТО (в синтасисе) - приведите примеры пожалста...

man bash
man sh - в системах где bash не линк на sh

Там усе расписано.
...
Рейтинг: 0 / 0
Погогите новичку с шел-скриптом
    #32890394
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а можно таки конкретный пример столь серьёзной пользЫ, чтобы использовать потенциально менее переносимый шелл?
...
Рейтинг: 0 / 0
Погогите новичку с шел-скриптом
    #32890449
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый Второй, Какой-То
В man посылать, енто как-то на 3 буквы, однако. Невежливо, стало быть (хорошо, что хоть на эти 3 буквы). Тем паче, шо man тупой, разницы между bash и sh все равно не даст. Можно, конечно diff на него напустить, но толку наверно мало будет =). Мы тут, так на заваленке гутарим, у кого какой опыт на сей счет имеется. Так не могли бы Вы своим опытом с честной аудиторией поделиться, шо такого в bash примечательного и ради чего Вы готовы пострадать из-за возможной несовместимости. Милости просим, однако...
...
Рейтинг: 0 / 0
Погогите новичку с шел-скриптом
    #32890462
Somebody2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DocAlНу а можно таки конкретный пример столь серьёзной пользЫ, чтобы использовать потенциально менее переносимый шелл?
А че так народ возбудился то? Да не агитирую я за bash. Было упоминание о безвозвратно потерянном на перенос времени. Собственно время надо потратить на установку непосредственно bash - по-моему несколько секунд всего. То есть я просто хотел сказать, что не такая уж это и большая проблема - менее переносимый - пока в основном да (в Линухе нет ), но поставляемый чуть ли не совсеми Юниксами... Но как всегда меня неправильно поняли - вон андрюшок даже хамить чего-то начал - наверное sh очень любит

Это конечно не очень серьезно, но мне например удобнее оформить цикл так:
Код: plaintext
1.
2.
3.
4.
for ((i= 0 ; i< 10 ; i++))
do
 echo $i
done

чем так

Код: plaintext
1.
2.
3.
4.
5.
6.
i= 0 
while [ $i -lt  10  ]
do
 echo $i
 i=$(($i+ 1 ))
done


Вообще у меня только Линуксы, а там везде башик по умолчанию ставится. Когда игрался с FreeBSD 4.5, мне тамошний sh каким-то убоговатым показался. Деталей не помню - давно это было.
...
Рейтинг: 0 / 0
Погогите новичку с шел-скриптом
    #32890521
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так еще лучше
Код: plaintext
1.
2.
3.
4.
for i in `jot  10   0 `
do
 echo $i
done
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Погогите новичку с шел-скриптом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]