더 우아한“ps aux | grep -v grep”


177

프로세스 목록을 확인하고 나에게 흥미로운 프로세스를 'grep'하면 그 grep자체도 결과에 포함됩니다. 예를 들어, 터미널을 나열하려면 다음을 수행하십시오.

$ ps aux  | grep terminal
user  2064  0.0  0.6 181452 26460 ?        Sl   Feb13   5:41 gnome-terminal --working-directory=..
user  2979  0.0  0.0   4192   796 pts/3    S+   11:07   0:00 grep --color=auto terminal

일반적으로 ps aux | grep something | grep -v grep마지막 항목을 제거 하는 데 사용 하지만 우아 하지는 않습니다. :)

이 문제를 해결하기 위해보다 우아한 해킹이 있습니까? (모든 명령을 별도의 스크립트로 래핑하는 것 외에는 나쁘지 않습니다)


4
가치가있는 것은 고대 FAQ입니다. faqs.org/faqs/unix-faq/faq/part3
tripleee

1
참조 주셔서 감사합니다. 그것이 그들의 방법입니다 :ps ux | awk '/name/ && !/awk/ {print $2}'
Jakub M.

그 역할은 무엇입니까 grep -v grep?
Jwan622

2
@ Jwan622 는 grep 결과에서 grep -v grep제외됩니다 grep. grep을 ps와 함께 사용하면 grep 프로세스 (grep 인수 포함)도 표시되어 결과가 복잡해집니다. grep -v grep
은이

답변:


282

일반적인 기술은 다음과 같습니다.

ps aux | egrep '[t]erminal'

이 포함 된 행 일치 terminal하는 egrep '[t]erminal'하지 않습니다! 또한 많은 유닉스 맛에서 작동합니다 .


1
이것은 임의의 문자열에는 효과가 있지만 사용자 이름에는 적합하지 않습니다 (예 :) ps aux | grep '[r]oot'. 아무도 이유를 알고 있습니까?
kxsong

2
@kxsong : | grep '[t]erminal''terminal'이라는 단어를 프로세스 목록에 넣지 않고 'terminal'이라는 단어가 포함 된 행을 선택합니다. 무엇을 이루려고 노력하고 | grep '[r]oot'있으며 어떻게 작동하지 않습니까? 더 나은 해결책이있을 것입니다.
Johnsyweb

3
내가 틀렸다면 바로 잡아주십시오. 그러나 이것은 잘린 캐릭터의 어떤 위치에서도 작동합니다 : ps aux | grep "te [r]
minal

2
화려한 해킹 (I는 억스 / GREP 저자는 아마도이 시나리오 생각하지 않았기 때문에 나는 그것을 그에게 전화한다고 생각합니다.)
마이클 Trouw

2
@JamieJag : 글쎄 ... 내 게시물에서 말했듯이을 grep '[t]erminal'포함하는 행과 일치합니다 terminal. 의 출력 에는 문자열이 포함되지 않은 (대괄호 포함) ps aux행이 있습니다 grep '[t]erminal'( terminal동일 하지 않음 ).
Johnsyweb

57

pgrep을 사용하십시오 . 더 안정적입니다.


pgrep예를 찾으면 작동하지 않습니다ps aux | grep 'ssh options'
Jakub M.

12
야 쿠브 M : pgrep -f어때요?
hillu

4
@ jakub-m 기본적으로 pgrep패턴은 프로세스 이름과 만 일치합니다. 전체 명령과 일치 시키려면 -f플래그를 사용하십시오 .
bluecollarcoder

3
pgrep프로세스 ID 만 반환합니다.
Melab

1
이전 버전이 필요했습니다 pgrep -fl(그러나 -f전체 cmdline과 일치 하지 않으면 전체 cmdline을 볼 수 없었습니다 . 세부 사항 : serverfault.com/a/619788/44183 ). 그러나 pid, cmdline 외에 다른 정보가 필요하면 ps. 다음을 결합 할 수 있습니다 :ps -p $(pgrep -f foo)
Beni Cherniavsky-Paskin

29

이 답변은 이전에 구축 pgrep 대답 . 또한 다른 기반으로 구축 대답 의 사용을 결합 ps과를 pgrep. 다음은 관련 교육 예제입니다.

$ pgrep -lf sshd
1902 sshd

$ pgrep -f sshd
1902

$ ps up $(pgrep -f sshd)
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      1902  0.0  0.1  82560  3580 ?        Ss   Oct20   0:00 /usr/sbin/sshd -D

$ ps up $(pgrep -f sshddd)
error: list of process IDs must follow p
[stderr output truncated]

$ ps up $(pgrep -f sshddd) 2>&-
[no output]

위의 함수 로 사용할 수 있습니다 :

$ psgrep() { ps up $(pgrep -f $@) 2>&-; }

$ psgrep sshd
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      1902  0.0  0.1  82560  3580 ?        Ss   Oct20   0:00 /usr/sbin/sshd -D

사용하여 비교 ps와 함께 grep. 유용한 헤더 행은 인쇄되지 않습니다 :

$  ps aux | grep [s]shd
root      1902  0.0  0.1  82560  3580 ?        Ss   Oct20   0:00 /usr/sbin/sshd -D

github.com/blueyed/oh-my-zsh/blob/… (단, Zsh에만 해당)를 참조하십시오 .
blueyed

@ blueyed, bash 함수 정의로 답변을 업데이트했습니다.
Acumenus

-d구분 기호를 지정하는 옵션 도 참고하십시오 . 예 :ps -fp$(pgrep -d , getty)
Toby Speight

1
:이 사용 ps uxp `pgrep <process>` p마지막 매개 변수 여야합니다 (즉, pux하지 않습니다 일)
KFL

9

예를 들어 ps 명령에서 필터링 할 수 있습니다.

ps u -C gnome-terminal

(또는 찾기 등으로 / proc를 통해 검색 )


1
이것은 GNU의 ps (Linux)에서는 작동하지만 BSD ps에서는 작동하지 않습니다.
Josh

GNU ps에서도 마찬가지입니다. ps -C <command>정확한 명령과 일치합니다. a또는 x옵션 과 함께 사용하면 다른 프로세스와 일치하는 프로세스 세트 외에도 프로세스 나열 a하고 x나열 하기 때문에 모든 프로세스를보고합니다 .
Animism

@Animism True. 고마워요
Andreas Frische

프로세스 이름이 정확하게 지정된 경우에만 작동합니다. 예 logind를 들어 for systemd-logind또는 인수 와 일치하는 부분 일치에는 작동하지 않습니다 .
Acumenus

4

하나 더 대안 :

ps -fC terminal

옵션은 다음과 같습니다.

 -f        does full-format listing. This option can be combined
           with many other UNIX-style options to add additional
           columns. It also causes the command arguments to be
           printed. When used with -L, the NLWP (number of
           threads) and LWP (thread ID) columns will be added. See
           the c option, the format keyword args, and the format
           keyword comm.

 -C cmdlist     Select by command name.
                This selects the processes whose executable name is
                given in cmdlist.

6
사소한 단점과 OP의 질문과 관련이없는 단점은 Tomcat과 같은 것을 표시하지 않는다는 것입니다 .Tomcat은 실제로 세탁 목록이있는 Java로 실행됩니다.
Charles Wood

-C옵션은 이미 @Andreas Frishe의 답변에서 1 년 반 전에 게시되었습니다…
Piotr Dobrogost

3

검색 패턴에서 대괄호를 사용하여 문자를 둘러싸 grep면 일치하는 정규 표현식이 포함되지 않으므로 프로세스가 제외됩니다 .

$ ps ax | grep 'syslogd'
   16   ??  Ss     0:09.43 /usr/sbin/syslogd
18108 s001  S+     0:00.00 grep syslogd

$ ps ax | grep '[s]yslogd'
   16   ??  Ss     0:09.43 /usr/sbin/syslogd

$ ps ax | grep '[s]yslogd|grep'
   16   ??  Ss     0:09.43 /usr/sbin/syslogd
18144 s001  S+     0:00.00 grep [s]yslogd|grep

3

면책 조항 : 나는이 도구의 저자이지만 ...

나는 px를 사용할 것이다 :

~ $ px atom
  PID COMMAND          USERNAME   CPU RAM COMMANDLINE
14321 crashpad_handler walles   0.01s  0% /Users/walles/Downloads/Atom.app/Contents/Frameworks/Electron Framework.framework/Resources/crashpad_handler --database=
16575 crashpad_handler walles   0.01s  0% /Users/walles/Downloads/Atom.app/Contents/Frameworks/Electron Framework.framework/Resources/crashpad_handler --database=
16573 Atom Helper      walles    0.5s  0% /Users/walles/Downloads/Atom.app/Contents/Frameworks/Atom Helper.app/Contents/MacOS/Atom Helper --type=gpu-process --cha
16569 Atom             walles   2.84s  1% /Users/walles/Downloads/Atom.app/Contents/MacOS/Atom --executed-from=/Users/walles/src/goworkspace/src/github.com/github
16591 Atom Helper      walles   7.96s  2% /Users/walles/Downloads/Atom.app/Contents/Frameworks/Atom Helper.app/Contents/MacOS/Atom Helper --type=renderer --no-san

현명한 명령 행 인터페이스로 프로세스를 찾는 것 외에 다른 유용한 것들도 많이 있습니다. 자세한 내용 은 프로젝트 페이지를 참조하십시오 .

Linux 및 OS X에서 작동하며 쉽게 설치할 수 있습니다.

curl -Ls https://github.com/walles/px/raw/python/install.sh | bash

0

최종 사용 사례에 따라 종종 Awk를 선호합니다.

ps aux | awk '/[t]erminal/'

이것은 당신이 같은 것을 가질 때 특히 그렇습니다

ps aux | grep '[t]erminal' | awk '{print $1}'  # useless use of grep!

명백하게 정규식은 Awk 스크립트에 사소하게 고려 될 수 있습니다.

ps aux | awk '/[t]erminal/ { print $1 }'

그러나 실제로 이것을 스스로 재발 명하지 마십시오. pgrep친구들은 오랫동안 주변에 있었고 대부분의 임시 재 구현보다이 전체 문제 공간을 훨씬 잘 처리했습니다.


-2

또 다른 옵션은 .bash_profile결과에서 'grep'을 greps하는 함수를 작성하기 위해 bash 별명을 유지하는 다른 파일 을 편집 하는 것입니다.

function mygrep {
grep -v grep | grep --color=auto $1
}

alias grep='mygrep'

grep -v grep첫째, 그렇지 않으면 될 당신의하는 --color=auto의지 어떤 이유로 작동하지.

bash를 사용하는 경우 작동합니다. 다른 쉘 YMMV를 사용하는 경우


1
별명 기능은 무엇입니까? 그냥 function grep { command grep -v grep | command grep --color=auto "$@"; }하십시오 (논쟁과 인용의 수정에 주목하십시오). 그러나 이것은 ps호출 grep하지 않으면 더 이상 작동하지 않기 때문에 깨집니다 (인수가 잘못 전달됨). 어쨌든, 훨씬 더 유용한 기능은 밖으로 그 자체와 일치하지 확인하기 위해 정규식을 수정 한 것이 아니라 필터 것 grep로부터 grep개별적으로 결과를. 물론 수십 년 전에 적절하게 해결 된 문제에 대한 새로운 솔루션을 발명하는 것은 그리 생산적이지 않습니다.
tripleee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.