LINUX.ORG.RU

размер буфера перенаправления

 ,


0

1

Запускаю iostat в режиме постоянного повторения и перенаправляю в файл

iostat -dx /dev/sdb2 5 >> testlog

– подождав минуту прерываю - всё ОК, статистика в файле.

Запускаю iostat в режиме постоянного повторения через sed и перенаправляю в файл

rm testlog
iostat -dx /dev/sdb2 5  | sed -E 's/^(.*)$/iostat:\1/' >> testlog

– подождав минуту прерываю - файл пустой.

Запускаю iostat в режиме однократного запуска через sed и перенаправляю в файл

rm testlog
iostat -dx /dev/sdb2  | sed -E 's/^(.*)$/iostat:\1/' >> testlog

– всё ОК, статистика в файле.

Очевидно sed ждет, пока наполнится буфер перенаправления.

Как сделать так, чтобы данные из программы обрабатывались на лету и сразу же записывались в файл?

(Дело в том, что я хочу чтобы в этот файл еще писал (через >>) top и исследуемая программа, и надо чтобы их вывод был совмещен и при том хронологически упорядочен)

Дело в том, что я хочу чтобы в этот файл еще писал (через >>) top и исследуемая программа

Не получится так. Пишите каждую итерацию каждого дампа в свой файл, и с небольшой задержкой отдельной job’ой собирайте в «большой» хронологический лог. Или 3 «параллельных» лога - так заработает с минимальными телодвижениями.

bugfixer ★★ ()

Про sed -u вам уже написали. Только это называется буфер потока ввода-вывода, man setvbuf.

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

iostat -d 5 | awk '{ print strftime("%s %c: iostat"), $0; fflush(); }'

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

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

проверка с добавлением времени (через awk как показано в другом ответе) показывает, что всё объединяется и ничего не перепутывается. А время отображается в выводе top.

кароче у меня получилось так

#! /bin/bash
set -m
set -e

interval=$1
outfile="$2"
shift
shift

rm -f "$outfile"
iostat -dx /dev/sdb2  $interval | sed -uE 's/^(.*)$/iostat:\1/' >> "$outfile" &
"$@" >> "$outfile" & # если сюда сделать конвейер, то $! даст pid bash-а, а не команды
top -b -d $interval -p $! | sed -uE 's/^(.*)$/top:\1/' >> "$outfile" &
fg 2
sleep $interval
sleep 5
kill %1
kill %3

И еще мониторящие программы убиваются после завершения исследуемой программы.

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

что всё объединяется и ничего не перепутывается.

Невозможно. У вас явно interval больше 5 секунд которые Вы захардкодили до exit. А первый дамп да - скорее всего даже выглядит чистеньким…

bugfixer ★★ ()

прикладное костылестроение

запуск через while не подойдёт?

while true
    iostat -dx /dev/sdb2  | sed -E 's/^(.*)$/iostat:\1/' >> testlog
    sleep 5
done
Ford_Focus ★★★★★ ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.