Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Конвеер в bash скрипте  (Прочитано 1054 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн StingNapas

  • Автор темы
  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Конвеер в bash скрипте
« : 31 Март 2017, 10:38:32 »
Доброго времени суток
Необходимо написать bash скрипт, вызывающий исполняемый файл с конфигурационным файлом. При запуске исполняемого файла в стандартный поток вывода идёт информация об ошибке.
Задачи:
1. Фильтровать эту информацию и если ошибка начинается с определенного слова, то записывать эту ошибку в log файл
2. Если искомая ошибка не появляется в течении N секунд, то останавливать эти процессы и запускать исполняемый файл с новым конфигурационным файлом.

Получилось реализовать схему с запуском исполняемого файла без конфигурационного файла. Скрипт выглядит примерно так:
./exeFile | grep textError > logTest.txt &
PID=$!
PID1=$(($PID-1))
temp="0"
while [ "$temp" = "0" ]
do
if [ $SECONDS == "time" ]
then
temp="1"
fi
done
kill -SIGTERM $PID
kill -SIGTERM $PID1

При попытке сделать то же самое с конфигурационным файлом, исполняемый файл запускается, но в лог файл ничего не пишется:  ./exeFile dir1/file.conf | grep textError > logTest.txt &
Если убрать фильтрацию grep-ом, то весь поток вывода записывается в лог файл без проблем.
Помогите пожалуйста решить эту проблему
« Последнее редактирование: 31 Март 2017, 11:44:23 от Punko »

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12073
  • Xubuntu 20.04 (64bit)
    • Просмотр профиля
Re: Конвеер в bash скрипте
« Ответ #1 : 31 Март 2017, 10:52:31 »
Что значит "не запускается"?
Какая возникает ошибка?
Просто запуск  ./exeFile dir1/file.conf проходит?
Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: http://help.ubuntu.ru/wiki/uefiboot

Оффлайн StingNapas

  • Автор темы
  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Re: Конвеер в bash скрипте
« Ответ #2 : 31 Март 2017, 11:19:36 »
Неправильно поставил вопрос: файл запускается, но в лог файл ничего не записывается

Punko

  • Гость
Re: Конвеер в bash скрипте
« Ответ #3 : 31 Март 2017, 11:43:51 »
StingNapas, а может ошибок просто нет?

Оффлайн StingNapas

  • Автор темы
  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Re: Конвеер в bash скрипте
« Ответ #4 : 31 Март 2017, 11:50:08 »
Punko, Ошибка представляет собой обычное сообщение в потоке вывода. Для эксперимента добавил в исходный код строки с выводом в стандартный поток дополнительных сообщений, которые и пытаюсь обрабатывать. Т.е. "ошибки" точно присутствуют.

Punko

  • Гость
Re: Конвеер в bash скрипте
« Ответ #5 : 31 Март 2017, 11:53:29 »
StingNapas, а почему не выводить эту штуку в stderr ?
Или в условии этого нет и не может быть?

И попробуй запустить с grep, но без перенаправления в файл - в stdout оно нормально всё грепает?
« Последнее редактирование: 31 Март 2017, 11:55:00 от Punko »

Оффлайн StingNapas

  • Автор темы
  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Re: Конвеер в bash скрипте
« Ответ #6 : 31 Март 2017, 12:06:31 »
Punko, 1. Задача обрабатывать именно stdout
2. Если сделать так "./exeFile dir1/file.conf | grep textError &", то в консоль ничего не выводится. Если посмотреть процессы командой ps, то и исполняемый файл, и grep запущены.
Если запустить без grep, т.е. "./exeFile dir1/file.conf &" все сообщения корректно выводятся в консоли.
Если запустить то же самое с выводом в файл, "./exeFile dir1/file.conf > logTest.txt &", в файл тоже всё пишется корректно.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6015
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Конвеер в bash скрипте
« Ответ #7 : 31 Март 2017, 12:29:36 »
./exeFile | grep textError > logTest.txt &
sleep N
if [ -s 'logTest.txt' ] ; then
    exit
fi
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн StingNapas

  • Автор темы
  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Re: Конвеер в bash скрипте
« Ответ #8 : 31 Март 2017, 13:35:01 »
Azure, если использовать Ваш скрипт, то фильтрация grep-ом и запись в файл осуществляется корректно, но запись происходит на протяжении N секунд. Мне же необходимо, чтобы при первом появлении ошибки в лог файле процессы завершались

Оффлайн scsiman

  • Активист
  • *
  • Сообщений: 344
    • Просмотр профиля
Re: Конвеер в bash скрипте
« Ответ #9 : 31 Март 2017, 13:52:31 »
Если искомая ошибка не появляется в течении N секунд, то останавливать эти процессы
Мне же необходимо, чтобы при первом появлении ошибки в лог файле процессы завершались

Вы противоречите сами себе.

При этом второе требование решается путём внесения изменений в исходный код, к которому вы имеете доступ, поскольку говорили, что
Цитировать
добавил в исходный код строки с выводом в стандартный поток дополнительных сообщений
Dell Studio XPS 16, Ubuntu 16.04 LTS (Home).
HP nx6110, Ubuntu 8.04 LTS => 10.04 LTS (Home).

Оффлайн StingNapas

  • Автор темы
  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Re: Конвеер в bash скрипте
« Ответ #10 : 31 Март 2017, 14:03:19 »
scsiman, Мне в любом случае нужно останавливать процессы, разница лишь в том, что если ошибки не было N секунд, то я должен перезапустить исходный файл с новым конфигурационным файлом, а если ошибка появилась, то необходимо прервать все процессы и не запускать снова.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6015
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Конвеер в bash скрипте
« Ответ #11 : 31 Март 2017, 15:03:20 »
if ./exeFile | grep -m 1 textError > logTest.txt ; then
    exit
fi &
sleep N
if [ -s 'logTest.txt' ] ; then
    exit
fi
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн StingNapas

  • Автор темы
  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Re: Конвеер в bash скрипте
« Ответ #12 : 31 Март 2017, 16:30:24 »
Azure, Большое спасибо, заработало) Единственное, что if [ -s 'logTest.txt' ] не срабатывает при пустом logTest, но с этим уж я разберусь) еще раз спасибо

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2628
    • Просмотр профиля
Re: Конвеер в bash скрипте
« Ответ #13 : 31 Март 2017, 17:43:34 »
еще:
./exeFile | awk 'BEGIN{ PROCINFO["/dev/stdin", "READ_TIMEOUT"] = 5000 }{ if(/textError/) { print ; exit }}' > logTest.txt5000 - это таймаут 5 сек.
Процесс exeFile'а будет закрыт при достижении таймаута или если в выводе будет найден textError.


Пользователь добавил сообщение 31 Март 2017, 17:56:41:
./exeFile | timeout 5 grep -m1 textError > logTest.txt
« Последнее редактирование: 31 Март 2017, 19:49:22 от renzrv »

 

Страница сгенерирована за 0.266 секунд. Запросов: 24.