LINUX.ORG.RU

Помогите лоху в решении задачки

 ,


0

1

Условие задачи: Имеется некоторая программа, которая выдает текстовую информацию в консоль. Необходимо написать скрипт, который, не мешая работе основной программы, вылавливал бы эту информацию и выполнял некоторые действия.

Скрипт, который бы читал информацию с консоли и выполнял действия, я написал. Теперь не могу понять как его запустить, чтобы он работал одновременно с программой. Если я запускаю скрипт, то не могу запустить программу, и наоборот. Подскажите, пожалуйста, как решить эту задачу или ткните ссылкой в аналогичный пример. Заранее благодарю всех откликнувшихся и желающих помочь.

чем не устраивает?

anonymous ()

перенаправь вывод в stdout в файл. утилитой tee
в другой сессии читай файл, парсь@выполняй

bl ★★★ ()
prog1 > script

Чем не устраивает?

anonymous ()
Ответ на: комментарий от bl

Спасибо. Но мне необходимо, чтобы скрипт выполнял действия немедленно без участия пользователей. Т.е. реагировал на выдаваемые программой сообщения.

vash_sa ()
Ответ на: комментарий от anonymous

Простите. Но можно ли поподробнее по поводу prog1 > script

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

Ну дык, программу кто-то, или что-то запускает?

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

Да из командной строки консоли. С параметрами. И после нее указать скрипт?

vash_sa ()
programm >> out.txt

Разве тебя не устроит?
P.S я не особо понял задачи. Тебе нужно парсить те логи которые оставляет программа?

daniilArch ★★ ()
Последнее исправление: daniilArch (всего исправлений: 1)
Ответ на: комментарий от vash_sa

google://перенаправление ввода/вывода bash

UPD. меня одного удивляет, как ты написал скрипт, не зная таких основ?

Deleted ()
Последнее исправление: nepank (всего исправлений: 1)
Ответ на: комментарий от daniilArch

Программа в консоль выбрасывает текстовые сообщения. Скрипт должен вылавливать их и изменять состояние входа контроллера в зависимости от сообщения

vash_sa ()
Ответ на: комментарий от daniilArch

Мне эти сообщения не нужны. Хранить их в файле не надо! Никто файл обрабатывать не будет.

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

Перенаправляй выхлоп проги в текстовый файл. А потом пере направляй данный из этого файла в свой скрипт.

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

Перенаправление меня не устраивает. Программа как выдавала в консоль свои сообщения так и должна выдавать.

vash_sa ()
Ответ на: комментарий от gorky

Спасибо! Правда, я им еще не пользовался. Но в этом что-то есть. Если бы простенький пример!

vash_sa ()

может, tee поможет?

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

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

З.Ы. ну или монл через дбас, однако это не подходит под твою формулировку задачи.

Deleted ()
Последнее исправление: nepank (всего исправлений: 2)
Ответ на: комментарий от vash_sa

tee - А это что за зверь?

ну, он читает stdin, пишет то же самое на stdout, но до кучи еще и перенаправляет в файл.

То есть

prog |tee pipe1

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

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

Перенаправлять данные из консоли в текстовый файл приводит к пропаданию управления из консоли программой. Поэтому этот вариант не приемлем. Необходимо, чтобы информация из консоли не исчезала. Как насчет фоновой загрузки скрипта? Это может мне помочь?

vash_sa ()
Ответ на: комментарий от dikiy

Спасибо! Добрый человек. Это должно реанимировать моего больного.

vash_sa ()
Ответ на: комментарий от anonymous

Спасибо. Полезная и своевременная информация по mkfifo.

vash_sa ()
Ответ на: комментарий от anonymous

А из mkfifo чтение также можно через read как из консоли?

vash_sa ()

Если перенаправлять ввод вывод,то приёмник будет ждать закрытия передающего канала.
Попробуй направить вывод в файл FIFO и читать из него командой dd с опциями bs=1 и count=1 для побайтного чтения вывода.
Сам файл создаётся командой
mknod -p /path_to_file

torvn77 ★★★★★ ()

Помогите лоху

Как можно так себя неуважать?

backburner ()
Ответ на: комментарий от vash_sa

Еще один не решенный вопрос. Как запустить на выполнение программу и скрипт одновременно?

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

Насчет фоновой загрузки - неуверен. Но можешь попробовать.

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

Понимаете? Скрипт и программа должны работать одновременно и не мешать друг другу. Я проверил по tee программа скидывает информацию в файл. Теперь мне нужен скрипт для обработки этого файла, который должен работать одновременно с программой. Но как это запустить - не пойму?

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

Может попробовать так:
prog1 && prog2

Нет,по очереди запускаются.
Ну тогда запускай в разных консолях.

torvn77 ★★★★★ ()
Последнее исправление: torvn77 (всего исправлений: 3)
Ответ на: комментарий от daniilArch

Фоновая загрузка не помогла. А как в линуксе по аналогии с Windows организуется многозадачность? Можно ли с консоли запустить несколько задач одновременно? А самое главное - как? Прошу прощения за элементарные вопросы. В линуксе я полный ноль.

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

man bash. Ищи по словам bg (background) и fg (foregroung)

anonymous ()
Ответ на: комментарий от vash_sa

В разных окнах консоли запусти, и воаля многозадачность)

daniilArch ★★ ()

Не понял чем тебя такой вариант не устраивает:

prog 2>&1 | script

Например:

perl -e '$| = 1; while (1) { print STDERR "test test test\n"; print STDOUT "tset tset tset\n"; sleep 2; } ' 2>&1  | grep tset

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

Спасибо. Вы используете скрипт фильтра? А на мой скрипт ответ такой: -bash: read.sh: command not found Текст скрипта #!/bin/bash read word echo «The word you entered is: $word» Что у меня не так? Отдельно скрипт работает, а в связке указанной Вами с программой выдает ошибку

vash_sa ()
Ответ на: комментарий от anonymous

Я к этому и пришел. Спасибо. Начитался про многозадачность. Теперь бы все это воплотить. С наступающим все праздником Днем победы!

vash_sa ()

Внимательно прочитав весь тред можно придти к весьма простому решению:

prog | tee | script

и всего делов...

echo "asbabsa" | tee | grep asb
asbabsa

как пример...

TheKnight ★★ ()
Последнее исправление: TheKnight (всего исправлений: 1)
Ответ на: комментарий от gorky

Используй Expect

+1, есть еще python-expect... ну а я накатал свой велосипед и он тоже работает :)

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

Прошу совета. Применил Expect для решения задачи. Вроде что-то стало получаться, но возникла новая проблема. Если expect ждет более 5 с. он закрывает консольную программу. А мне надо, чтобы она работала. Как быть? Подскажите, пожалуйста.

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

И да, по дефолту этот параметр как раз 5 секунд. Я не знаю как это задать в обычном expect, но в pexpect это есть, думаю и в обычном expect есть.

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