ps 명령이 전체 프로세스 목록을 표시하지 않는 이유는 무엇입니까?

ps 명령이 전체 프로세스 목록을 표시하지 않는 이유는 무엇입니까?

이 명령을 실행 하면 ps awx | grep -v grep다음 출력이 생성됩니다. 다음 목록은 전체 출력의 마지막 20줄입니다.

 4247 pts/1    Ss+    0:00 /bin/bash
 4442 ?        S<     0:00 [kworker/u17:1]
 4661 ?        S<     0:00 [kworker/u17:3]
 4731 ?        S<     0:00 [kworker/u17:5]
 4734 ?        S      0:00 pickup -l -t fifo -u
 4847 ?        S<     0:00 [kworker/u17:7]
 4850 ?        S      0:00 [kworker/u16:3]
 4878 ?        S      0:00 [kworker/u16:0]
 5201 ?        S<     0:00 [kworker/u17:8]
 5353 ?        S      0:00 [kworker/0:1]
 5354 ?        S      0:00 [kworker/7:2]
 5355 ?        S      0:00 [kworker/u16:2]
 5361 ?        S      0:00 [kworker/4:0]
 5362 tty1     Ss     0:00 -bash
 5396 ?        S      0:00 [kworker/6:0]
 5418 ?        S      0:00 [kworker/0:0]
 5420 ?        S      0:00 [kworker/2:2]
 5431 ?        S      0:00 [kworker/7:0]
 5562 ?        S      0:00 [kworker/4:2]
 5620 tty1     R+     0:00 ps awx

ps awx | grep grep후속 명령을 실행하면 다음 출력이 생성됩니다.

5646 tty1     S+     0:00 grep --color=auto grep

또한 다음 명령을 실행하면 ps awx | grep agetty다음 출력이 표시됩니다.

5669 tty1     S+     0:00 grep --color=auto agetty

명령이 ps awx프로세스 식별 번호 5646 및 5669를 표시하지 않는 이유는 무엇입니까? 실제로 5620 이후에는 다른 프로세스가 나열되지 않습니다.

답변1

ps awx 명령이 프로세스 식별 번호 5646 및 5669를 표시하지 않는 이유는 무엇입니까?

왜냐하면 당신은 단지 5646주문의 일부로 ps awx | grep grep, 그리고 주문의 일부로 5669시작 했기 때문입니다. ps awx | grep agetty초기 목록 다음에 시작하므로 목록에 표시되지 않습니다. 둘 다 해당 특정 파이프의 프로세스에 대한 입력이 처리될 때까지 실행되므로 ps향후 목록에도 표시되지 않습니다.

마찬가지로 ps반복해서 실행하면 프로세스 ID가 변경되는 것을 볼 수 있습니다. 명령을 실행할 때마다 새 프로세스가 시작됩니다.


보다 구체적으로 문제의 두 번째 프로세스는 다음과 같습니다.

5669 tty1     S+     0:00 grep --color=auto agetty

여기에는 매개변수 와 가 grep이미 제공되어 있습니다 . 이는 의 명령과 일치하며 플래그 는 별칭에서 나올 수 있습니다. 이것은 과정이 아닙니다 . 그 중 하나는 Debian 시스템의 이 예에서와 같이 명령줄의 첫 번째 부분으로 또는 를 가질 수 있습니다.--color=autoagettygrepps awx | grep agetty--color=autoagettyagetty/sbin/agetty

1269 tty3     Ss+    0:00 /sbin/agetty --noclear tty3 linux

답변2

fork()프로세스는 커널 내부와 외부 모두에서 커널을 통해 마이크로초 단위로 들어오고 나갈 수 있습니다 . 실제로 인용해보면마이클 포칼라키스:

PID가 사용자 공간에서 잘못된 순서로 나타나는 이유는 커널 스케줄링이 fork() 호출 사이에서 프로세스를 분기할 수 있기 때문입니다. 실제로 이것은 매우 일반적입니다.

그래서 그 사이에 많은 일이 ps awx | grep -v grep일어났습니다 ps awx | grep grep. 새로운 프로세스와 스레드가 있습니다. ps포착되기 전에 종료됩니다. 마지막 예에서도 동일한 논리가 발생합니다 ps awx | grep grep. 그러나 grepPID는 실제로 최신이 아닐 수도 있습니다. 관련 답변의 Gilles지적했다:

[p]iped 명령이 동시에 실행됩니다. ps | grep ...을 실행할 때 ps 또는 grep이 먼저 시작되는지 여부는 운의 문제입니다(또는 쉘 작업의 세부 사항과 커널 내부 스케줄러의 미세 조정의 문제). 어쨌든 그들은 계속됩니다.

또한 그 grep -v grep목적 은 ps출력에서 ​​자신을 제거하는 것입니다( | grep -v [g]rep이 경우 실제로 권장되는 경우가 많습니다.관련 게시물).

관련 정보