프로세스에서 `ps -e | less`에 "less"가 표시되는 이유는 무엇입니까? [복사]

프로세스에서 `ps -e | less`에 "less"가 표시되는 이유는 무엇입니까? [복사]

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

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

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

그러나 이 논리에 따르면 두 가지 모두 의 출력에 나타나서 는 안 ps됩니다 .lessps

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

답변1

이것껍데기두 가지 모두를 시작하여 파이프의 양쪽 끝을 설정하면 ps파이프의 다른 쪽 끝에서 자신과 프로세스를 볼 수 있습니다.

답변2

"그러나 이 논리에 따르면 ps의 출력에는 ps도 less도 나타나지 않아야 합니다."

예, 모두 나타나기 때문에 논리가 잘못되었습니다. Un*x 셸에서 명령을 실행할 때 실제로 셸에서 실행되는 명령은 거의 없습니다. 명령을 실행하려면 별도의 프로세스를 포크하십시오.

두 명령을 함께 파이프하면 두 명령이 별도의 프로세스에서 시작되고 첫 번째 명령의 표준 출력이 두 번째 명령의 표준 입력에 연결됩니다.

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

ps는 프로세스 목록을 탐색하면서 자신과 그 이하뿐만 아니라 상위 쉘, 상위 쉘의 상위 쉘 등을 찾아서 표시합니다. 그리고 시스템의 다른 모든 것. 이것이 바로 출력에 ps 이하가 포함되는 이유입니다.

답변3

사용

ps -ef | grep [l]ess

덜 피하기 위해.

  • [l]essless정규식과 일치하지만 고정 문자열과 일치 하지 않습니다.

관련 정보