$ ps aux | tee >(head -n1) | grep syslog
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
syslog 806 0.0 0.0 34600 824 ? Sl Sep07 0:00 rsyslogd -c4
grep
и head
команды запускаются приблизительно в то же время, и оба получают те же входные данные на их собственном досуге, но обычно, как данные становятся доступными. Существуют некоторые вещи, которые могут представить 'несинхронизируемый' вывод, который зеркально отражает строки; например:
Мультиплексированные данные от tee
на самом деле отправляется в один процесс перед другим, завися, прежде всего, от реализации tee
. Простое tee
реализация будет read
некоторая сумма входа, и затем write
это дважды: Однажды к stdout и однажды к его аргументу. Это означает, что одно из тех мест назначения получит данные сначала.
Однако каналы все буферизуются. Вероятно, что эти буферы являются 1 строкой каждый, но они могли бы быть больше, который может заставить одну из команд получения видеть все, в чем это нуждается для вывода (т.е. grep
строка плетеной корзинки) перед другой командой (head
) получил любые данные вообще.
Несмотря на вышеупомянутое, также возможно, что одна из этих команд получает данные, но не может сделать что-либо с ними вовремя, и затем другая команда получает больше данных и обрабатывает их быстро.
Например, даже если head
и grep
отправляются данные одну строку за один раз, если head
не знает, как иметь дело с ним (или отложен из-за планирования ядра), grep
может показать его результаты прежде head
даже получает шанс к. Для демонстрации попытайтесь добавить задержку: ps aux | tee >(sleep 1; head -n1) | grep syslog
Это почти наверняка произведет grep
вывод сначала.
$ ps aux | tee >(grep syslog) | head -n1
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
Я полагаю, что Вы часто только получаете одну строку здесь, потому что head
получает первую строку входа и затем закрывает его stdin и выходы. Когда tee
видит, что его stdout был закрыт, он затем закрывает свой собственный stdin (вывод от ps
) и выходы. Это могло быть зависящим от реализации.
Эффективно, единственные данные это ps
добирается для отправки, первая строка (определенно, потому что head
управляет этим), и возможно некоторые другие строки прежде head
& tee
закройте их stdin дескрипторы.
Несоответствие с тем, появляется ли вторая строка, представлено путем синхронизации: head
завершения stdin, но ps
все еще отправляет данные. Эти два события не хорошо синхронизируются, таким образом, строка, содержащая syslog
все еще имеет шанс добирания tee
аргумент ( grep
команда). Это подобно объяснениям выше.
Можно избежать этой проблемы в целом при помощи команд, которые ожидают всего входа прежде, чем закрыть stdin/exiting. Например, использовать awk
вместо head
, который считает и обработает все его строки (даже если они не вызовут вывода):
ps aux | tee >(grep syslog) | awk 'NR == 1'
Но обратите внимание, что строки могут все еще казаться неисправными, как выше, который может быть продемонстрирован:
ps aux | tee >(grep syslog) | (sleep 1; awk 'NR == 1')
Надежда это не было слишком большим количеством детали, но существует много одновременных вещей, взаимодействующих друг с другом. Отдельные процессы работают одновременно без любой синхронизации, таким образом, их действия с каким-то конкретным выполнением могут варьироваться; иногда это помогает вырыть глубоко в базовые процессы для объяснения почему.
Что-то вроде этого должно сделать это.
$ du -s application[12]
$ ls -l
total 16
drwxrwxr-x 2 saml saml 4096 Nov 28 01:51 application1
drwxrwxr-x 2 saml saml 4096 Nov 28 01:51 application1_edit
drwxrwxr-x 2 saml saml 4096 Nov 28 01:51 application2
drwxrwxr-x 2 saml saml 4096 Nov 28 01:51 application2_edit
Использование диска:
$ du -s application[12]
4 application1
4 application2