왜 `ps -e | less`는 프로세스 간에 'less'를 표시합니까?

왜 `ps -e | less`는 프로세스 간에 'less'를 표시합니까?

난 달린다 ps -ejH | less. 출력에는 psless도 포함됩니다.

이유는 무엇입니까? 나는 그것이 다음과 같이 작동할 것이라고 생각했다:

  1. 먼저 ps실행되고 해당 순간에 존재하는 모든 프로세스가 나열됩니다.
  2. 그런 다음 의 출력이 ps에 공급됩니다 less.

그러나 이 논리에 따르면 not도 의 출력에 나타나서는 ps안 됩니다 .lessps

그렇다면 이러한 프로세스가 의 출력에 포함되는 이유는 무엇입니까 ps? ps내가 설명한 것과 조금 다르게 작동 합니까 ?

답변1

그만큼껍데기파이프의 끝을 설정하기 위해 두 가지를 모두 시작하므로 ps파이프의 다른 쪽 끝에서 프로세스뿐만 아니라 자체도 볼 수 있습니다.

답변2

"그러나 이 논리에 따르면 ps의 출력에는 ps도 그 이하도 나타나서는 안 됩니다."

예, 둘 다 나타나기 때문에 논리가 잘못되었습니다. Un*x 셸에서 명령을 실행할 때 실제로 셸에서 실행되는 경우는 거의 없습니다. 해당 명령을 실행하기 위해 별도의 프로세스가 분기됩니다.

두 명령을 함께 파이프하면 두 명령 모두 별도의 프로세스에서 실행되고 첫 번째 명령의 stdout은 두 번째 명령의 stdin에 연결됩니다.

따라서 ps|less를 실행한 직후에는 3개의 프로세스가 생성됩니다. 하나는 쉘을 실행하고, 하나는 ps를 실행하고, 하나는 less를 실행합니다. 출력은 ps에 의해 생성되므로 less에 의해 병렬로(필요에 따라 시간 분할) 작업됩니다. 두 명령 모두 버퍼링을 최소화하면서 순차적이 아닌 병렬로 실행됩니다.

ps는 프로세스 목록을 통해 작업하면서 자신과 그 이하, 상위 쉘, 상위 쉘의 상위 등을 찾아서 init까지 표시합니다. 그리고 시스템의 다른 모든 것. 이것이 출력에 ps와 less가 모두 포함되는 이유입니다.

답변3

사용

ps -ef | grep [l]ess

덜 피하기 위해.

  • [l]ess정규식으로는 일치 less하지만 고정 문자열로는 일치하지 않습니다.

관련 정보