Получение размера каталогов и исключает некоторые папки

$ 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 команды запускаются приблизительно в то же время, и оба получают те же входные данные на их собственном досуге, но обычно, как данные становятся доступными. Существуют некоторые вещи, которые могут представить 'несинхронизируемый' вывод, который зеркально отражает строки; например:

  1. Мультиплексированные данные от tee на самом деле отправляется в один процесс перед другим, завися, прежде всего, от реализации tee. Простое tee реализация будет read некоторая сумма входа, и затем write это дважды: Однажды к stdout и однажды к его аргументу. Это означает, что одно из тех мест назначения получит данные сначала.

    Однако каналы все буферизуются. Вероятно, что эти буферы являются 1 строкой каждый, но они могли бы быть больше, который может заставить одну из команд получения видеть все, в чем это нуждается для вывода (т.е. grepстрока плетеной корзинки) перед другой командой (head) получил любые данные вообще.

  2. Несмотря на вышеупомянутое, также возможно, что одна из этих команд получает данные, но не может сделать что-либо с ними вовремя, и затем другая команда получает больше данных и обрабатывает их быстро.

    Например, даже если 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')

Надежда это не было слишком большим количеством детали, но существует много одновременных вещей, взаимодействующих друг с другом. Отдельные процессы работают одновременно без любой синхронизации, таким образом, их действия с каким-то конкретным выполнением могут варьироваться; иногда это помогает вырыть глубоко в базовые процессы для объяснения почему.

3
29.11.2013, 01:11
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
5
27.01.2020, 21:17

Теги

Похожие вопросы