이 명령을 실행 하면 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=auto
agetty
grep
ps awx | grep agetty
--color=auto
agetty
agetty
/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
. 그러나 grep
PID는 실제로 최신이 아닐 수도 있습니다. 관련 답변의 Gilles지적했다:
[p]iped 명령이 동시에 실행됩니다. ps | grep ...을 실행할 때 ps 또는 grep이 먼저 시작되는지 여부는 운의 문제입니다(또는 쉘 작업의 세부 사항과 커널 내부 스케줄러의 미세 조정의 문제). 어쨌든 그들은 계속됩니다.
또한 그 grep -v grep
목적 은 ps
출력에서 자신을 제거하는 것입니다( | grep -v [g]rep
이 경우 실제로 권장되는 경우가 많습니다.관련 게시물).