LINUX.ORG.RU
решено ФорумAdmin

Скриптописание

 ,


0

1

Доброго дня!

Есть простой вопрос.

Имеется непрерывный stdin (Например, такой: cat /dev/urandom |grep -oEa [0-9][0-9])

Задача.

Данные из этого stdin писать в файл $FILE в течении, скажем, 10 секунд,

останавливать запись,

прогонять файл через awk (cat $FILE|awk '{магия}')

обнулять файл (cat /dev/null > $FILE)

И по новой.

То что тут цикл - ежу понятно. Не могу только понять, как это хозяйство реализовать.

Наверное потому что не еж.



Последнее исправление: cetjs2 (всего исправлений: 2)

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

teamfighter
() автор топика

На вскидку вижу запуск в фоне 'cat /dev/urandom |grep -oEa [0-9][0-9]', после чего в переменной окружения '$!' (PID=$!) у вас окажется pid запущенного в фоне процесса. После запуска процесса в фоне запускаете 'sleep 10' для ожидания в 10 секунд, после «убиваете, процесс, PID которого вы получили ранее делаете манипуляции с файлом, всё это „заворичиваете“ в цикл.

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

Выглядит красиво, но, к сожалению, процесс выдающий stdin убивать нельзя.

cat /dev/urandom |grep -oEa [0-9][0-9]' я привел лишь в качестве примера. Может, можно еще как-то?

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

То есть stdin нужно передать на обработку скрипту, а он уже пусть творит магию)

teamfighter
() автор топика

Данные из этого stdin писать в файл $FILE в течении, скажем, 10 секунд

Может проще определённое количество? Это если действительно из рандома. Тогда head -c <кол-во> /dev/urandom

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

С количеством действительно проще, но тут нужно именно время. Вообще задачка интересная, с 10 утра над ней думаю)

teamfighter
() автор топика

Подозреваю, что файл здесь вообще не нужен, раз он периодически обнуляется. Сразу в awk загонять и каждые 10 минут обрабатывать

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

В случае получения данных с /dev/random без разницы ...

Ну а если серьёзно, cat добавляет данные в файл (>>), возможно что после каждой операции добавления файл закрывается, но я не читал документацию по cat и не смотрел его код, это только предположение.

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

echo «» > aaa
В случае вот таких ковычек «» в нём будут данные, а в случае таких:

""
нет.

Ну и сам файл размера-то нулевого (в случае)

echo "" > aaa
Просто ls выводит размер занимаемых файлом блоков, но информация о файле должна же куда-то записываться, правильно, прямо в inode, который тоже занимает место.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)

что-то по типу

# запускаем процеc писатель 
# FILE открывается с O_APPEND, если не выйдет попробовать tee -a 
cat /dev/random... >> $FILE &
while true; do  
   # какое-то время
   sleep 10
   # откидыавем то что написалось
   cp $FILE $PIE
   # зовём awk на то что откинули
   awk...
   # обнуляем файло
   truncate -s 0 $FILE
done
[/bash]
не проверял, рецепт найден в гугле по "file truncate" первая строка сверху

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

Кавычки заменились ЛОРом. Епта, echo "" печатает пустую строку и ПЕРЕВОД СТРОКИ (один байт) — учи мат.часть.

sdio ★★★★★
()
Последнее исправление: sdio (всего исправлений: 1)
while :;
timeout 10 cat /dev/urandom |grep -oEa [0-9][0-9] > file
awk '{магия}' file
done

Обнуляться он и так будет при каждом цикле

YAR ★★★★★
()
Последнее исправление: YAR (всего исправлений: 2)
Ответ на: комментарий от teamfighter

Как-то так

xxd /dev/urandom | while true
do
  STOPTIME=$((`date +%s`+5)) 
  while [ $((`date +%s`)) -lt $STOPTIME ]; do 
    read R
    echo "$R" >> tmphexfile 
  done
  < tmphexfile xxd -r > tmpsrcfile
  < tmpsrcfile awk '{магия}'
  rm tmphexfile tmpsrcfile
done

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

А при чем тут random к timeout? Перед любой ключевой командой, отдающей поток, ставишь timeout - штатную команду - и получаешь ограничение по времени выполнения этой команды.

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

Рандом всё равно с какой позиции читать. Все остальные файлы нет. У тебя каждый раз будет с начала считываться, а у меня последовательно.

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

Да, с этой стороны не подумал, ну а так да, всё правильно.

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

только по условию ТС процесс 'cat /dev/random|grep..' нельзя ни убивать ни останавливать.

Нельзя останавливать скрипт. А запись - можно

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

Кстати остаётся вопрос, не будут ли теряться байты при убиении cat'а timeout'ом.

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

Ты не прав, при использовании timeout указанная программа работает указанное время, потом завершается. В случае /dev/random это роли не играет, ТС привёл это для примера. Но если ему нужно обрабатывать данные какой-либо программы, которую нельзя останавливать, то timeout не подойдёт.

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

Надо бы определиться что ТС имеет ввиду под «нельзя останавливать»? Если нельзя kill -9, но можно kill -STOP / kill -CONT то все решается просто.

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

> Но если ему нужно обрабатывать данные какой-либо программы, которую нельзя останавливать, то timeout не подойдёт.

Вот именно такой случай.

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

под «нельзя останавливать»? Если нельзя kill -9, но можно kill -STOP / kill -CONT то все решается просто. Ни то ни другое нельзя. stdin вообще есть по умолчанию, трогать его не надо

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

Обнови свой некродистр:

rain@elitebook:~$ which timeout
/usr/bin/timeout
rain@elitebook:~$ dpkg -S `which timeout`
coreutils: /usr/bin/timeout
rain@elitebook:~$ apt-cache policy coreutils
coreutils:
  Установлен: 8.13-3.5

Еще в новостях двухлетней давности оно упоминается. Конкретного релиза, когда появился timeout пока не вижу, хотя помню эту новость

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

Если не читать stdin (во время обработки awk'om), то твоя программа получит от системы «блокировку» (забыл как называется) когда буфер пайпа заполнится. Т.е. вполне допустимо приостановить выполнение программы при помощи kill -STOP, затем продолжить ее при помощи kill -CONT, программа даже не узнает что ее останавливали

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

Хм... Пайпать в fifo-сокет, а оттуда cat'ать в нужный момент?

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

4,5 года эта команда уже штатно в coreutils'ах. А для некродистров можно и пакет доставить

YAR ★★★★★
()
здесь stdin | awk 'BEGIN {t1=systime()}; 
                  { 
                     магия
                  }

                  (systime()-t1) >= 600 {
                     сброс структур/переменных в начальное состояние;
                     t1=systime()
                  }
sdio ★★★★★
()
Ответ на: комментарий от sdio

А можете немного синтаксис поправить? А то никак не соображу куда тут что воткнуть чтобы конструкция завелась

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

кавычку забыл закрыть

лучше так выделить

здесь stdin | awk -f script.awk

=== file script.awk ===

BEGIN { t1=systime()  }

 {  магия  }

 (systime()-t1) >= 600  {
    сброс структур/переменных в начальное состояние;
    t1=systime()
 }
sdio ★★★★★
()
Последнее исправление: sdio (всего исправлений: 1)
Ответ на: комментарий от teamfighter
 cat /dev/urandom |grep -oEa [0-9][0-9]|awk 'BEGIN {t1=systime()}; {sum+=$1} END { print sum/NR};    (systime()-t1) >= 1 {t1=systime();}'

Вот в таком виде просто висит и ничего не делает

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

Это же не десктоп тебе, в ынтерпрайзе всё по-взрослому

Да, можешь и очко прошляпить только в путь; так что фильтруй-то, базар.

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

Делает. Просто у тебя условия выхода на END нет, вот и не печатает.

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

awk был в условии. Почитай для общего развития.

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