grep이 내 ps를 침범합니다.

grep이 내 ps를 침범합니다.

어떤 프로세스를 확인할 때 나는 보통 다음과 같이 씁니다.

ps aux | grep myprocess

그리고때때로내가 얻는 결과

eimantas 11998  0.0  0.0   8816   740 pts/0    S+   07:45   0:00 grep myprocess

프로세스가 실행되고 있지 않은 경우.

ps이제 grep이 명령의 출력을 필터링하는 경우 프로세스 목록에 grep이 나타나는 이유를 알고 싶습니다.뒤쪽에 ps벌써 도망갔어?

답변1

이 동작은 완전히 정상적이며 bash가 파이프 사용을 관리하는 방식으로 인해 발생합니다.

파이프는 bash를 사용하여 구현됩니다.pipe시스템 호출. 해당 호출 후 bash는 표준 입력(파일 설명자 0) 올바른 프로세스( )의 입력을 사용합니다 grep. 기본 bash 프로세스는 또 다른 포크를 생성하고 표준 입력 대신 fifo의 출력 설명자를 전달합니다(파일 설명 1) 왼쪽에 있는 명령을 실행합니다.

유틸리티는 ps명령 다음에 시작되므로 grep출력에서 ​​확인할 수 있습니다.

믿을 수 없다면 set -x활성화 명령 추적을 사용할 수 있습니다. 예를 들어:

+ ps aux
+ grep --color=auto grep
+ grep --color=auto systemd
alexises  1094  0.0  0.8   6212  2196 pts/0    S+   09:30   0:00 grep --color=auto systemd

자세한 지침은 기본 C 셸의 다음 섹션을 확인하세요.http://www.cs.loyola.edu/~jglenn/702/S2005/Examples/dup2.html

답변2

프로세스의 존재에만 관심이 있을 때는 pgrep이 동작을 표시하지 않는 프로세스를 사용합니다. 예를 들면 다음과 같습니다.

$ pgrep myprocess
1900

다른 경우(더 많은 정보에 관심이 있는 경우) 일반적으로 | grep -v grep삭제할 grep 줄을 추가합니다. 예를 들면 다음과 같습니다.

$ ps -ef | grep myprocess| grep -v grep

답변3

pipe처럼 동작하지 않습니다 . ;두 프로세스를 동시에 시작합니다. 그렇기 grep때문에 이 명령도 나타납니다. 따라서 ps aux | grep myprocess, ps auxis include 를 제공하면 grep myprocessgrep은 이를 출력에 포함시킵니다.

이를 확인하기 위해 dd테스트 서버에서 다음과 같은 두 가지 명령을 실행했습니다.

[sreeraj@server ~]$ dd if=/dev/urandom of=/home/sreeraj/myfile1 bs=1M count=1024 | dd  if=/dev/urandom of=/home/sreeraj/myfile2 bs=1M count=1024

프로세스 를 확인하면 dd두 프로세스가 동시에 시작되었음을 알 수 있습니다(2:55분이 경과했음을 나타내는 막대를 확인하세요).

[sreeraj@server ~]$ ps aux | grep 'dd if'
sreeraj  14891  100  0.2   5376  1416 pts/0    R+   11:56   2:55 dd if=/dev/urandom of=/home/sreeraj/myfile1 bs=1M count=1024
sreeraj  14892  100  0.2   5376  1412 pts/0    R+   11:56   2:55 dd if=/dev/urandom of=/home/sreeraj/myfile2 bs=1M count=1024
sreeraj  14936  0.0  0.1   9032   672 pts/1    S+   11:59   0:00 grep --color=auto dd if
[sreeraj@server ~]$

이제 grep의 출력을 제외하려면 정규식을 사용하십시오. grep결과에서 제외 됩니다 :

ps aux | grep "[m]yprocess"

예를 들어, httpd 프로세스를 찾고 있다면 다음을 사용하세요:

ps aux | grep "[h]ttpd"

그러나 나는 그것을 사용하는 것이 좋습니다 pgrep -a. 더 안정적일 것입니다.

[sreeraj@server ~]$ pgrep -a httpd
8507 /usr/sbin/httpd -DFOREGROUND
8509 /usr/sbin/httpd -DFOREGROUND
8510 /usr/sbin/httpd -DFOREGROUND
8511 /usr/sbin/httpd -DFOREGROUND
8513 /usr/sbin/httpd -DFOREGROUND
8529 /usr/sbin/httpd -DFOREGROUND
[sreeraj@server ~]$

답변4

다음 사고 실험을 생각해 보세요. 실행이 호출 되어야 한다고 생각하기 ps전에 실행이 완료 되면 grep이는 셸에 다음이 필요하다는 의미입니다.

  1. 옮기다 ps.
  2. 모든 출력을 버퍼링합니다(더 이상 갈 곳이 없기 때문에).
  3. 옮기다 grep.
  4. 저장된 출력을 greps 에 공급합니다 stdin.

이는 낭비 입니다. 먼저 호출하는 것이 메모리를 사용 grep하고 입력을 기다린 다음 pss를 stdout직접 공급하는 더 효율적인 방법입니다 .grepstdin

또는 극단적인 경우를 고려하려면 다음과 같이 무한한 양의 출력을 생성하는 프로그램의 출력을 파이핑하는 경우를 고려하십시오.

$ yes | less

셸이 yes이전에 실행 되면 less영원히(또는 컴퓨터 메모리가 완전히 소진될 때까지) 기다리게 됩니다.

관련 정보