그러니까 이건 질문 자체가 아니고 그냥 제가 궁금해서 하는 질문이에요. 저는 Debian의 포크인 Linux Mint MATE를 사용하고 있습니다. 만약 내가한다면:
ps afx | grep abcdefg
나는 얻다:
16599 pts/3 S+ 0:00 | \_ grep --color=auto abcdefg
그래서 grep의 과정을 보여줍니다. 하지만 그건뒤쪽에파이프라인에서 : 위의 코드가 실행 되고 결과를 얻은 다음 에 전달할 ps
것이라고 생각했을 것입니다 . 그렇다면 실제로 결과 에 나타나는 이유는 무엇입니까 ? 앞으로도 이렇게 되지 않을까요? 파이프가 실제로 어떤 용도로 사용되는지에 대한 기본 지식이 부족한 것 같습니다.ps
grep
grep
ps
답변1
이 질문은 중복되었으며 unix.stackexchange.com에 속합니다.
요약하면 OpenGroup의쉘 명령 언어문서에는 "에 대한 세부 사항이 비교적 모호합니다.관로":
파이프는 제어 연산자 "|"로 구분된 하나 이상의 명령 시퀀스입니다. 마지막 명령을 제외한 모든 명령의 표준 출력은 다음 명령의 표준 입력에 연결되어야 합니다.
파이프의 형식은 다음과 같습니다.
[!] command1 [ | command2 ...]
명령 1의 표준 출력은 명령 2의 표준 입력에 연결되어야 합니다. 명령의 표준 입력, 표준 출력 또는 둘 다 명령의 일부로 리디렉션 연산자에 의해 지정된 리디렉션 전에 파이프에 의해 할당된 것처럼 처리되어야 합니다(리디렉션 참조).
파이프가 백그라운드에 있지 않은 경우(비동기 목록 참조), 쉘은 파이프에 지정된 마지막 명령이 완료될 때까지 기다려야 하며 가능하면 모든 명령이 완료될 때까지 기다려야 합니다.
데이터가 파이프라인에서 "왼쪽에서 오른쪽으로" 흐르는 것은 분명하지만 일정 자체는 보장되지 않습니다.
또한보십시오:
답변2
일정은 크게 중요하지 않습니다. 한 시간 동안의 작업을 배관하는 것을 고려한다면, 파이프는 첫 번째 프로그램 시작부터 완료까지 지속적으로 열린 상태로 유지됩니다. 두 번째 프로그램은 첫 번째 프로그램과 정확히 동일한 시간 동안 실행되며 두 프로그램은 일반적으로 동시에 완료됩니다.
즉, ps는 출력을 취한 다음 grep으로 보내지 않습니다. 둘 다 동시에 실행되고 하나의 출력이 두 번째 출력으로 공급됩니다.실시간. 첫 번째 프로그램이 완료될 때까지 기다리는 대신 한 시간 분량의 데이터를 수집하여 한 번에 두 번째 프로그램으로 보냅니다.
실제로는 어느 정도의 버퍼링(수백 문자)이 있지만 특히 여러 파이프가 관련된 경우에는 더욱 그렇습니다. 그러나 대부분의 경우 동시에 실행되고 서로 직접 통신하는 것이 가능합니다.
답변3
여기에는 어느 정도 타이밍이 관련되어 있다고 생각합니다.
mkfifo /tmp/pipe
echo >/tmp/pipe
(쉘 프로세스가 일시 중지됩니다)
어느 것이 먼저 시작하는지는 중요하지 않습니다. 왜냐하면 독자가 그 끝을 열 때까지 저자는 어쨌든 차단하기 때문입니다. 따라서 거의 모든 일반 Unix 프로그램은 다른 작업을 수행하기 전에 i/o를 초기화하므로 프로세스가 적어도 파이프의 읽기 측에서 열 수 있을 만큼 충분히 확립될 ps
때까지 정지됩니다 .grep
cat </tmp/pipe &
echo >/tmp/pipe
(이번에는 멈추지 않습니다)
grep
이 순서는 당신이 항상 거기에 도달한다는 것을 의미합니다.
그러나 다른 방법도 있습니다.
예를 들어 GNU 실행 프로세스의 argv0을 찾고 있다면 ps
다음과 같이 할 수 있습니다.
ps -C argv0
을 사용하려는 경우 grep
이는 완전히 가능 하지만 다시 argv0을 검색하십시오.
ps -eocomm= -opid=| grep ^argv0
...각 명령에 대한 인수를 제외합니다.
그리고 물론:
pgrep argv0