Рейтинг:1

Почему `ps -x | grep foo` включить команду grep?

флаг cn

я знаю, что это делает (часто) включать процесс grep, и я знаю, добавляя | грэп -в грэп или цепляться за [ф] оо вместо этого предотвратит это, но мой вопрос больше о порядке операций, я думаю.

Например, в этом надуманном примере я вижу несколько процессов grep:

% пс -х | логин | логин | логин | логин grep
 2475 ?? 0:00.03 /usr/libexec/loginitemregisterd
 2115 ttys004 0:00.04 логин -fp джейсонриксон
29715 ttys004 0:00.00 логин grep
29716 ttys004 0:00.00 логин grep
29717 ttys004 0:00.00 логин grep
29718 ttys004 0:00.00 логин grep

Это говорит мне, что пс -х должен быть выполнен прошлой в этой строке, поскольку в ней перечислены все последующие команды grep. Однако это непоследовательно. Иногда он будет отображать 4, 3, 2 или даже ни одного из процессов grep. Это означало бы для меня, что это не всегда прошлой.

В чем дело?

Bravo avatar
флаг us
`|` устанавливает канал от `ps -x` stdout до `grep login` stdin ... поэтому оба процесса должны быть запущены, чтобы канал существовал.
Рейтинг:3
флаг vn

Как указывает Браво, канал в Linux — это не файл, а динамический. Так пс-х | логин grep на самом деле запустит обе программы одновременно, так что одна сможет опустить трубу, а другая поймать. Причина, по которой это не детерминировано, почему ваш надуманный пример не всегда показывает четыре grep instances, заключается в том, что экземпляр не может быть запущен до тех пор, пока в конвейере не появится что-то, что он может сделать; или рассматриваемый экземпляр может быть запущен не полностью, когда PS читает список процессов.

Рейтинг:1
флаг nc

Unix — многозадачная операционная система. Он не запускается ps первым или последним. Он запускает все вещи в конвейере параллельно. Некоторые могут финишировать первыми или стартовать после стартов ps, и именно из этого исходит ваша гонка, что делает результаты немного недетерминированными.

По сути, здесь нет порядка действий. Конвейер — это поток данных, а не математическая формула.

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

Ответить или комментировать

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