Я запускаю ps -ejH | less
. Вывод включает в себя ps
и less
также.
В чем причина? Я думал, что это будет работать следующим образом:
- Сначала
ps
запустится и выведет список всех процессов, существующих на данный момент. - Затем вывод
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
как регулярное выражение, но не как фиксированную строку.