Как я использую мишень для перенаправления к grep

Я думаю, что Вы ищете/usr/local/share/, но трудно ответить, так как это зависит от того, какой регистрируют Ваш, планируют "совместно использовать" между пользователями.

Но если мы говорим об офисных файлах, или что-то как этот, возможно, необходимо использовать, используют некоторую систему пересмотра как подверсия или мерзавец. И затем у пользователей будет контроль/клон в их homedir.


Обновление: способ сделать это немного лучше мог быть, что каждый пользователь получает свой собственный subdir в совместно используемой папке. Ему разрешают записать в его собственной папке, но не других подпапках. И всем пользователям разрешают читать из всех каталогов. Тем путем Вы не должны думать о коллизиях файла, если два пользователя используют то же имя файла, или удаляет файлы колледжей по ошибке.

Btw идея позади/usr/описан в Стандарте Иерархии Файловой системы (http://www.pathname.com/fhs/2.2/fhs-4.1.html)

- "/usr является совместно используемыми, данными только для чтения".

Таким образом, я, вероятно, использовал бы dir или в/home/или в/var/вместо этого...

13
13.04.2017, 15:36
3 ответа
$ 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')

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

19
27.01.2020, 19:53
  • 1
    Превосходный Ответ! Я на самом деле спросил, потому что я интересуюсь базовыми процессами. Когда вещи неустойчивы, я нахожу это интересным. Там был бы лучший способ работать ps aux | tee >(grep syslog) | head -n1 который остановился бы head закрытие stdout. Ничего себе, эта команда начала давать вывод теперь, но как это произошло бы в соответствии с Вашим ответом, это, кажется, является усеченным USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND syslog 806 –  Rqomey 12.09.2012, 16:55
  • 2
    Можно использовать что-то, что не закрывает stdin вместо head. Я обновил ответ с этим примером: ps aux | tee >(grep syslog) | awk 'NR == 1' –  mrb 12.09.2012, 17:01
  • 3
    @KrzysztofAdamski, когда Вы используете >(cmd), оболочка создает именованный канал и передачи что как аргумент команде (tee). Затем tee пишет в stdout (переданный по каналу к awk) и также к тому аргументу. Это совпадает с mkfifo a_fifo ; grep ... a_fifo в одной оболочке и ps | tee a_fifo | awk ... в другом. –  mrb 12.09.2012, 19:35
  • 4
    @KrzysztofAdamski gnu.org/software/bash/manual/html_node / … — Попытка echo >(exit 0), который повторит действительный аргумент, переданный оболочкой (в моем случае, это становится /dev/fd/63). Это должно работать то же над ударом и zsh. спасибо –  mrb 13.09.2012, 17:11
  • 5
    @mrb: это - очень интересная функция, которую я не знал прежде, спасибо. Это работает некоторым странным способом в ударе, однако, см. pastebin.com/xFgRcJdF. К сожалению, у меня нет времени для исследования этого теперь, но я сделаю это завтра. спасибо парни –  Krzysztof Adamski 13.09.2012, 17:34

grep syslog не всегда показывается, поскольку это зависит от синхронизации. При использовании конвейера оболочки Вы выполняете команды почти одновременно. Но ключевой вещью здесь является слово "почти". Если ps концы сканируя все процессы прежде grep запускаются, это привычка быть в списке. Можно получить случайные результаты в зависимости от загрузки системы и т.д.

Подобная вещь происходит с Вашей мишенью. Это выполняется на знаниях в подоболочке, и это может быть запущено прежде или после grep. Поэтому выходной порядок непоследователен.

Что касается вопроса о мишени, это - поведение, является довольно странным. Это вызвано тем, что это не используется в, он - нормальный путь. Это выполняется без любых аргументов, что означает, что это должно просто скопировать данные из, он - stdin к stdout. Но это - stdout, перенаправляется для подокружения верхнего колонтитула (в первом случае) или grep (2-й случай). Но это также передается по каналу к следующей команде. Я думаю, что то, что происходит в этом случае, является на самом деле зависящим от реализации. Например, на моем ударе 4.2.28, ничто никогда не пишется для подокружения stdin. На zsh это работает надежное способ, которым Вы хотели бы (печатающий и первую строку PS и искавшие строки), каждый раз, когда я пробую,

2
27.01.2020, 19:53
  • 1
    Это объясняет одну вещь так или иначе, я удивлен, что мишень задерживает grep, работающий до значимой степени! –  Rqomey 12.09.2012, 16:43

Немного hackish, но вот мое решение, в форме a psgrep() функция оболочки я использую:

Перенаправьте ps строка заголовка к STDERR, затем grep на STDOUT, но сначала удалите grep сама команда, для обхода "шумовой" строки, происходящей от grep самостоятельно:

psgrep() { ps aux | tee >(head -1>&2) | grep -v " grep $@" | grep "$@" -i --color=auto; }
0
27.01.2020, 19:53

Теги

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