ps
는 프로세스 목록을 조회하기 위해, grep
은 원하는 텍스트가 포함된 문자열만 콘솔에 출력하기 위해, awk
는 입력 데이터를 행과 단어 별로 처리해 출력하기 위해 사용합니다. 이 3개를 조합하면, python이라는 키워드가 포함된 프로세스 목록에서 프로세스 ID만을 가져오는 등의 일을 할 수 있습니다.
ps
실행 중인 프로세스를 봅니다. 자주 사용하는 flag들은 아래와 같습니다.
ps au
a
는 다른 유저의 프로세스까지 함께 조회하는 것을 의미하고, u
는 프로세스를 실행한 유저, CPU, 메모리 usage, 상태 등을 함께 조회합니다.
> ps au
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
root 31206 0.7 0.0 4268244 1164 s001 R+ 10:39PM 0:00.00 ps au
planb 29678 0.1 0.0 4308544 1608 s001 S 10:32PM 0:00.05 -bash
root 29677 0.0 0.0 4341328 6336 s001 S 10:32PM 0:00.02 login -fp planb
planb 29676 0.0 0.1 4345384 14428 s001 Ss 10:32PM 0:00.03 /Applications/iTerm.app/Cont
프로세스의 상태
모든 프로세스에는 상태
가 있습니다. 위의 STAT
컬럼에 있는 R+, S, Ss 등이 상태입니다.
- D : Uninterruptible sleep(종료할 수 없는(깨울 수 없는) sleep 상태)
- R : 실행 중, 또는 실행 가능한 상태
- S : Interruptible sleep(종료할 수 있는(깨울 수 있는) sleep 상태)
- T : 중지됨(작업 제어 신호를 받거나, 트레이싱 때문에)
- X : 죽음(대부분 보이지 않음)
- Z : Defunct(좀비) 프로세스. 종료되었으나 부모 프로세스에 의해 수습되지 않음
grep
grep은 사실 특정 문자열이 들어있는 파일을 검색하고 싶을 때 사용하는데, 콘솔 output에서 특정 문자열이 들어있는 부분만 가져오기 위해서도 사용됩니다.
> ps au | grep python
root 15790 0.0 0.1 68008 4036 pts/6 S 21:46 0:00 sudo -E python3.4 server.py
root 15791 1.4 3.1 1757368 63708 pts/6 Sl 21:46 0:50 python3.4 server.py
root 15806 99.8 2.1 546964 43980 pts/6 R 21:46 57:09 python3.4 server.py
python
이 포함된 라인만 출력되는 것을 볼 수 있습니다.
-v
grep -v
는 해당 문자열이 제외된, 즉 문자열이 포함되어 있지 않은 라인을 출력합니다.
> ps au | grep -v python
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 812 0.0 0.0 14556 12 tty4 Ss+ Jan11 0:00 /sbin/getty -8 38400 tty4
root 815 0.0 0.0 14556 12 tty5 Ss+ Jan11 0:00 /sbin/getty -8 38400 tty5
root 820 0.0 0.0 14556 12 tty2 Ss+ Jan11 0:00 /sbin/getty -8 38400 tty2
python
이 포함되어 있지 않은 라인만 출력되는 것을 볼 수 있습니다.
egrep
egrep
은 정규 표현식을 지원하여 여러 개의 문자열을 동시에 찾을 수 있습니다.
> ps au | egrep "python|mongod" | grep -v sudo
root 6129 1.8 5.5 367280 113984 pts/1 Sl+ May09 36:18 mongod --auth
root 15791 1.4 3.1 1757368 63708 pts/6 Sl 21:46 0:52 python3.4 server.py
root 15806 99.8 2.1 546964 43980 pts/6 R 21:46 61:36 python3.4 server.py
root 17320 0.0 0.1 8184 2108 pts/0 S+ 22:48 0:00 egrep --color=auto python|mongod
python
이나 mongod
가 포함되어 있고, sudo
가 포함되지 않은 라인을 출력합니다.
awk
grep
과 비슷하게, 패턴을 검색하고 처리하기 위한 언어입니다. grep처럼 파일에서 특정 문자열을 검색하여 가공하기 위한 명령어인데, 콘솔 출력에 적용할 수 있습니다. awk 'pattern'
, awk {action}
, awk 'pattern {action}'
중에 하나의 문법을 사용할 수 있습니다. 여기서는 ps와 grep을 섞어 여기서는 특정 필드만 출력하기 위해 사용하겠습니다. 위에서 말했던, python이라는 키워드가 포함된 프로세스 목록에서 프로세스 ID만을 가져오는 커맨드입니다.
> ps au | grep -v python | awk '{print $2}'
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 812 0.0 0.0 14556 12 tty4 Ss+ Jan11 0:00 /sbin/getty -8 38400 tty4
root 815 0.0 0.0 14556 12 tty5 Ss+ Jan11 0:00 /sbin/getty -8 38400 tty5
root 820 0.0 0.0 14556 12 tty2 Ss+ Jan11 0:00 /sbin/getty -8 38400 tty2