LinuxForum.Fans
Тема

Помогите со скриптом

Автор: max9000 14 сообщений 3049 просмотров
#70145

У меня возникла трудность с написанием скрипта, который бы следил за log файлом и при появлении в нем фразы "now error" скрипт выполнял бы команду "killall ua135" а через 3 сек. "start ua135"

text

#!/bin/sh

echo "Killing all ua135processes..." killall ua135 sleep 10

echo "Restarting ua135..." /home/start ua135

sleep 20

echo "Check........" while [ -n "$(grep "now error" /home/ua135.log)" ] do echo "error" echo "--------------------------------" echo "Killing all ua135..." killall ua135 sleep 10 echo "Deleting the old ua135.log..." rm -rf /home/ua135.log echo "Restarting ua135..." /home/start ua135 sleep 20 done echo "It is running"

Но скрипт не заработал и прошу помочь с выявлением ошибки.
За любую подсказку для решения данной проблемы буду очень благодарен.

#70149

Значит, лог постоянно пополняется. Если это возможно, я бы создал именнованный канал и заставил ua135 писать лог в него. А скрипт пускай открывает этот именнованный канал и построчно читает оттуда данные. Не надо будет ждать 20 секунд и каждый раз перечитывать файл.
Вообще, насколько связан скрипт с программой?

Но скрипт не заработал и прошу помочь с выявлением ошибки.

killall ua135
sleep 10

echo "Restarting ua135..."
start ua135

sleep 20

А не '/home/start ua135' ли случайно?

#70154

Что б каждые 20 секунд проверяло, это подходит.
Только зачем создавать именнованый файл, если есть log файл?
Скрипт с программой никак не связан, т.к. он служит лишь для удобства, т.е при возникновении ошибки ua135 перезапускается.
А в последнем сообщении, то я ошибся случайно, уже исправил.

#70155

довольно сложно написать скрипт, который-бы следил за постоянно изменяющимся файлом.
намного проще засунуть вывод в пайп, и обрабатывать его по времени. в данном случае так видимо не получится, т.к. вы собрались убить процесс-источник(?).

Попробуйте зайти с другой стороны: анализируйте логфайл командой tail с опциями -n -s -f
но было-бы проще, если-бы вы нормально описали задачу.

ЗЫЖ используйте тег CODE.

#70156
max9000 написал:
Скрипт с программой никак не связан, т.к. он служит лишь для удобства, т.е при возникновении ошибки ua135 перезапускается.

а кто пишет в лог?

#70158

А в log пишет процесс
Задача, что б при появлении в логе данной фразы процесс остановился и запустился заново т.к. в данном процессе фраза "now error" означает внутреннею ошибку, но сам процесс все равно продолжает выполнятся.

#70159
drBatty написал:
...
но было-бы проще, если-бы вы нормально описали задачу.
...

Полностью поддерживаю.
Как правило, все «велосипеды» уже изобретены, главное — правильно спросить, где находится нужный.

#70183
max9000 написал:
Задача, что б при появлении в логе данной фразы процесс остановился и запустился заново т.к. в данном процессе фраза "now error" означает внутреннею ошибку, но сам процесс все равно продолжает выполнятся.

решение:
"процесс"

text
$ cat >log
ddd
ggf
ddfg
dfdd
dfffd
TEST
Завершено

в это время работает "скрипт":

text
$ tail -f log|sed 's/TEST/killall cat/e'
ddd
ggf
ddfg
dfdd
dfffd

только вот:
1) напоминает грязный хак
2) ненадёжно
3)

Lupo Alberto написал:
Как правило, все «велосипеды» уже изобретены, главное — правильно спросить, где находится нужный.
#70187
drBatty написал:
Попробуйте зайти с другой стороны: анализируйте логфайл командой tail с опциями -n -s -f

после ротации, tail ведь не откроет лог по новой?
max9000, используйте runit, демонизируйте ваш кривой ua135 и перезапускайте sv restart ua135
а то killall...

#70190
system-root написал:
после ротации, tail ведь не откроет лог по новой?

зачем? так можно лог читать на 5Гб ;)

-f, --follow[={name|descriptor}]
output appended data as the file grows; -f, --follow, and --follow=descriptor are equivalent
system-root написал:
max9000, используйте runit, демонизируйте ваш кривой ua135 и перезапускайте sv restart ua135
а то killall...

логично... но вообще, ИМХО, ua135 может и сам перезапустится.

#70191
drBatty написал:
ИМХО, ua135 может и сам перезапустится.

не в россии..

#70344

Поэтому можно немного подробнее т.к. с linuxom связался недавно. Данное зависание происходит раз или два в день, потому большой лог ему не грозит и в своем скрипте при перезапуске лог стирается ( стирался бы, если скрипт работал ) командой rm -rf /home/ua135.log Прошу показать практческий пример скрипта, который при появлении нужного значения в файле выполнял бы определенную функцию. А в моем скрипте проблема такова, что он останавливается /на пол пути/ т.е до поиска в файле нужной мне фразы он не доходит, но висит в процессах.

#70347
max9000 написал:
rm -rf /usr/local/etc/oscam.log

зачем тут -rf ?!!!
ладно -f, оно всё равно не работает в скрипте, но -r ??? а если ошибётесь? К чертям весь /usr/local/etc, который вы мучительно долго настраивали, и тем не менее не забекапили? Пробел - кнопка большая. А символ маленький. И незаметный:
rm /usr/local/etc/ oscam.log
А?

max9000 написал:
Прошу показать практческий пример скрипта, который при появлении нужного значения в файле выполнял бы определенную функцию.

Доктор, меня игнорируют!
а это что?!

text
$ tail -f log|sed 's/^TEST$/killall cat/e'

Этот "скрипт" из двух команд делает в точности то, что вы пытаетесь добиться. Я его протестировал - работает.

То, что у вас изначальна кривая постановка задачи - вам уже рассказали.

PS: поправил свой "скрипт", а то от расстройства даже сам ошибся :(

#70852

Дайте пожалуйста эту строчку более подробнее т.е. куда путь, куда фразу... Прошу извинить за лаМерство, но так исторически сложилось...

Войдите или зарегистрируйтесь, чтобы ответить.