Перенаправление вывода iostat в файл

Почему вывод iostat не перенаправляется в файл в следующей команде:

iostat -x 3 | awk '/sda/ { print $11, $12}' > /tmp/disk_utilization 

Отличается ли поведение iostat от любой другой команды?

Спасибо заранее


person isaac.hazan    schedule 27.02.2014    source источник
comment
В моей версии iostat нет флага -x. В противном случае я не могу воспроизвести эту проблему.   -  person kojiro    schedule 27.02.2014
comment
То же самое здесь на Mac OSX.   -  person Mark Setchell    schedule 27.02.2014
comment
Кодзиро и Марк, как вы, ребята, останавливаете iostat? Ctrl+С? Вы видите что-то в файле, на который перенаправляется?   -  person isaac.hazan    schedule 27.02.2014
comment
укрытие, 2&›1 не помогает.   -  person isaac.hazan    schedule 27.02.2014
comment
Интересно, у меня то же самое. Ничего не вижу на стандартном выходе, если я использую tee. Печатает нормально, без переадресации.   -  person arco444    schedule 27.02.2014
comment
Кстати, я использую: [root@myvm my_scripts]# cat /etc/redhat-release CentOS версии 6.2 (окончательная)   -  person isaac.hazan    schedule 27.02.2014
comment
@isaac.hazan, по-видимому, в OS X просто печатает одну строку, если вы не скажете ему провести опрос. Так это проблема буферизации строк?   -  person kojiro    schedule 27.02.2014
comment
@kojiro Да, вывод буферизуется и хранится в памяти до тех пор, пока он не будет закрыт, то есть когда файл заполняется выводом.   -  person jaypal singh    schedule 27.02.2014


Ответы (2)


Похоже, вам нужно добавить счетчик, чтобы сообщить потоку, когда он должен завершиться ( man iostat ) . Вы только добавляете интервал:

If the interval parameter is specified without the count parameter, the iostat command generates reports continuously. 

Когда я пытаюсь:

iostat -x 3 6 | awk '/sda/ { print $11, $12}' > outfile

6 говорит iostat остановиться после 6 итераций с 3-секундными интервалами. После завершения итераций iostat я получаю файл output.

В качестве альтернативы вы можете выбрать какое-либо выражение, чтобы заставить сценарий awk выйти. Когда я пытаюсь:

iostat -x 3 | awk -v max=10 '/sda/ { print $11, $12; max++ } NR > max { exit } ' > outfile2

Я получаю только 3 строки в output2, что имеет смысл, потому что iostat -x выводит на экран строк на экран.

Вы также можете заставить awk fflush(stdout) в каждом цикле печати:

iostat -x 3 | awk '/sda/ { print $11, $12; fflush(stdout) }' > output3

а затем закройте iostat с помощью <ctrl+c> из оболочки.

person n0741337    schedule 27.02.2014

Причина вашей проблемы в том, что канал буферизован (вероятно, 4k), поэтому, если вы достаточно долго будете ждать, пока вывод будет сброшен в файл, он больше не будет пустым.

person Adrian Frühwirth    schedule 27.02.2014