Почему `ps -e | less` показывает «less» среди процессов?

Почему `ps -e | less` показывает «less» среди процессов?

Я запускаю ps -ejH | less. Вывод включает в себя psи lessтакже.

В чем причина? Я думал, что это будет работать следующим образом:

  1. Сначала psзапустится и выведет список всех процессов, существующих на данный момент.
  2. Затем вывод psбудет передан в less.

Но согласно этой логике, ни то, ни другое psне lessдолжно появляться в выводе ps.

Итак, почему эти процессы включены в вывод ps? psРаботает ли это немного иначе, чем я описал?

решение1

Theоболочканачинает оба, чтобы установить концы трубы, поэтому psвидит себя, а также процесс на другом конце трубы.

решение2

«Но согласно этой логике, ни ps, ни less не должны появляться в выводе ps».

Да, так что ваша логика неверна, потому что они обе появляются. Когда вы запускаете команду в оболочке Un*x, очень немногие (если вообще таковые имеются) на самом деле запускаются в оболочке. Отдельный процесс разветвляется для запуска этой команды.

При объединении двух команд обе команды запускаются в отдельных процессах, а стандартный вывод первой команды связывается со стандартным вводом второй.

Итак, вскоре после выполнения ps|less у вас есть три процесса: один, запускающий вашу оболочку, один, запускающий ps, и один, запускающий less. Поскольку вывод генерируется ps, он будет обрабатываться less параллельно (с временными интервалами по мере необходимости). Обе команды выполняются параллельно, а не последовательно, с минимальной буферизацией.

По мере того, как ps проходит по списку процессов, он находит и отображает и себя, и less, и родительскую оболочку, и родителя родителя, и так далее до init. И все остальное в системе. Вот почему ваш вывод включает и ps, и less.

решение3

Использовать

ps -ef | grep [l]ess

чтобы избежать меньшего.

  • [l]essсопоставлять lessкак регулярное выражение, но не как фиксированную строку.

Связанный контент