왜 `ps -x | grep foo`에 grep 명령이 포함되어 있습니까?

왜 `ps -x | grep foo`에 grep 명령이 포함되어 있습니까?

나는 그것을 알고있다하다(종종) grep 프로세스를 포함하면 대신 추가하거나 | grep -v grepgrep하면 [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

Bravo가 지적했듯이 Linux의 파이프는 파일이 아니라 동적입니다. 따라서 ps -x | grep login실제로 두 프로그램을 동시에 시작하여 하나는 파이프를 아래로 내리고 다른 하나는 잡을 수 있도록 합니다. 결정적이지 않은 이유, 즉 여러분이 고안한 예제가 항상 4개의 grep인스턴스를 표시하지 않는 이유는 파이프에 수행할 작업이 있을 때까지 인스턴스가 시작되지 않을 수 있다는 것입니다. 또는 ps프로세스 목록을 읽을 때 문제의 인스턴스가 완전히 시작되지 않을 수 있습니다 .

답변2

유닉스는 멀티태스킹 운영체제이다. ps를 처음이나 마지막으로 시작하지 않습니다. 파이프라인의 모든 작업을 병렬로 시작합니다. 일부는 먼저 끝나거나 ps가 시작된 후에 시작할 수 있으며, 이것이 바로 경주가 시작되는 곳이므로 결과가 약간 비결정적입니다.

기본적으로 여기에는 작업 순서가 없습니다. 파이프라인은 수학 공식이 아닌 데이터 스트림입니다.

유닉스 파이프의 장점은 첫 번째 프로그램이 끝나기 전에 두 번째 프로그램이 입력 처리를 시작할 수 있다는 점입니다. 따라서 다음 프로그램에 전달하기 전에 전체 데이터 스트림을 메모리(또는 디스크)에 수집하고 저장할 필요가 없습니다. 파이프 안에 있는 것.

관련 정보