어떤 프로세스를 확인할 때 나는 보통 다음과 같이 씁니다.
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 aux
is include 를 제공하면 grep myprocess
grep은 이를 출력에 포함시킵니다.
이를 확인하기 위해 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
이는 셸에 다음이 필요하다는 의미입니다.
- 옮기다
ps
. - 모든 출력을 버퍼링합니다(더 이상 갈 곳이 없기 때문에).
- 옮기다
grep
. - 저장된 출력을
grep
s 에 공급합니다stdin
.
이는 낭비 입니다. 먼저 호출하는 것이 메모리를 사용 grep
하고 입력을 기다린 다음 ps
s를 stdout
직접 공급하는 더 효율적인 방법입니다 .grep
stdin
또는 극단적인 경우를 고려하려면 다음과 같이 무한한 양의 출력을 생성하는 프로그램의 출력을 파이핑하는 경우를 고려하십시오.
$ yes | less
셸이 yes
이전에 실행 되면 less
영원히(또는 컴퓨터 메모리가 완전히 소진될 때까지) 기다리게 됩니다.