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

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

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

% ps -x | grep login | grep login | grep login | grep login
 2475 ??         0:00.03 /usr/libexec/loginitemregisterd
 2115 ttys004    0:00.04 login -fp jasonerickson
29715 ttys004    0:00.00 grep login
29716 ttys004    0:00.00 grep login
29717 ttys004    0:00.00 grep login
29718 ttys004    0:00.00 grep login

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

Что происходит?

1
задан 24 September 2021 в 00:29
2 ответа

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

3
ответ дан 24 September 2021 в 00:44

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

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

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

1
ответ дан 24 September 2021 в 01:53

Теги

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