본문 바로가기
개발/리눅스 서버

프로세스 관리하기 - 1) ps

by ny0011 2021. 3. 11.
반응형

리눅스에서 프로그램을 실행하면 프로그램의 복사본(인스턴스)을 생성하는데 

실행 중인 프로그램을 따로 프로세스(process)라고 부른다.

프로세스 리스트(ps), 시스템 사용량 모니터링(top), 프로세스를 멈추기(kill) 등을 할 수 있는 도구를 제공함.

1. 프로세스

  • 프로세스: 실행 중인 명령의 복사본(인스턴스), vi를 10번 실행하면 10개의 프로세스가 생성됨

PID(프로세스 ID)로 프로세스들을 구분 가능.

현재 실행 중인 PID들은 중복 불가능.

  • runaway process(프로세스가 멈추지 않음 or 계속 새 프로세스를 만듦) 같은 것들이 시스템 성능을 저하시킬 수 있기 때문에 프로세스 관리가 필요함
  • 메모리나 CPU 속성을 기준으로 특정 프로세스를 찾아 제거하는 과정이 필요함
  • /proc(시스템 리소스 정보가 저장되는 곳)에 저장된 데이터를 가져와서 실행 중인 프로세스의 정보를 표시하게 됨.
  • /proc에 숫자로 된 폴더들이 PID번호와 같음

2. 프로세스 출력하기

가장 많이 사용되는 건 ps, 시각적으로 보기 좋은 건 top, 그래픽 기반 도구는 gnome-systemmonitor

1) ps

ps manual page를 참고해보았다

  • ps는 active process의 정보를 ps를 실행한 순간 기준으로 보여줌
  • 만약 process 정보를 반복해서 업데이트가 필요하면 top을 사용하기
  • ps는 옵션을 사용할 수 있는데 UNIX, BSD, GNU에 따라 옵션 선언 방식이 달라짐
  • UNIX : 옵션을 모아서 써도 되고 -를 꼭 써야함
  • BSD : 옵션을 모아서 써도 되고 -를 꼭 쓰지 않아도 됨
  • GNU long : --option 으로 써야함
  • 기본적으로 ps는 같은 effective user ID(euid=EUID)를 현재 user로 여기고 같은 terminal에서 실행된 모든 프로세스를 선택한다.
  • PID, process와 연관된 terminal(tname=TTY), [DD-]hh:mm:ss 형식의 누적 CPU time(time=TIME), executable name(ucmd=CMD)을 출력함. 결과는 기본적으로 정렬되지 않음.

ps 만 하면 PID, TTY, TIME, CMD 값만 출력됨.

/proc/PID번호 에서 PID에 관한 정보들을 확인할 수 있고

예를 들어 /proc/PID번호/io를 보면 PID에서 io관련해서 사용한 정보를 알 수 있음

$ ps
   PID TTY          TIME CMD
 62583 pts/21   00:00:00 ps
158327 pts/21   00:00:00 bash

$ cat /proc/158327/io
rchar: 12190342
wchar: 3553973
syscr: 18652
syscw: 4821
read_bytes: 1519616
write_bytes: 339968
cancelled_write_bytes: 114688

 

  • ps 명령을 사용하는 예시는 다음과 같다
1) 표준 방식으로 모든 process를 보고 싶으면 :
          ps -e
          ps -ef
          ps -eF
          ps -ely

2) BSD 방식 :
          ps ax
          ps axu

3) process tree를 보고 싶으면 :
          ps -ejH
          ps axjf

4) thread의 정보를 얻고 싶으면 :
          ps -eLf
          ps axms

5) 보안 정보를 얻고 싶으면 :
          ps -eo euser,ruser,suser,fuser,f,comm,label
          ps axZ
          ps -eM

6) root(real & effective ID)로 실행되는 모든 프로세스를 user format으로 보고 싶으면 :
          ps -U root -u root u

7) 사용자가 정의한 형식대로 프로세스를 보고 싶으면 : 
          ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
          ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
          ps -Ao pid,tt,user,fname,tmout,f,wchan

8) syslogd의 PID만 보고 싶으면 :
          ps -C syslogd -o pid=

9) PID 42의 이름만 보고 싶으면(ubuntu 14.04에서는 SysV option 미지원 에러) :
          ps -q 42 -o comm=

 

  • process 선택하는 간단한 옵션
옵션 이름 설명
-A/-e 모든 프로세스 선택
-a      session leader(getsid(2) 보기)와 terminal과 연관 되지 않은 프로세스를 제외하고 모든 프로세스 선택
-d      session leaders를 제외하고 모든 프로세스 선택
--deselect/-N
              
해당 조건을 만족하는 프로세스를 제외하고 모든 프로세스 선택(선택한 것을 제외)
   이 terminal과 연관된 모든 process를 선택.
다른 옵션없이 t 옵션을 쓰는 것과 같은 동작을 함.
r       running process들만 제한해서 선택
a BSD 스타일 "only yourself" 제한을 해제

"only yourself" 제한 : 일부 BSD 스타일("-"없는) 옵션이 사용되거나 ps personality 설정이 BSD와 유사할 때 모든 프로세스에 적용됨

다른 말로
이 옵션을 사용하면
ps가 터미널(tty)을 사용해 모든 프로세스를 보여주거나
x 옵션과 함께 사용할 때 모든 프로세스를 보여줌
BSD 스타일 "must have a tty" 제한을 해제

다른 말로
이 옵션을 사용하면
사용자(ps와 같은 EUID)가 갖고 있는 모든 프로세스를 보여주거나 
a 옵션과 함께 사용하면 모든 프로세스를 보여줌

 

  • process를 리스트로 선택하기

이 옵션들은 blank로 나누거나 comma(,)로 나누어진 리스트의 형식을 single argument로 받음

ex) ps -p "1 2" 혹은 ps -p 3,4

 

  • process 출력 형식을 사용자가 변경할 수 있음
# u : user기반 형식으로 보여줌

$ ps u
USER  PID  %CPU %MEM  VSZ   RSS  TTY      STAT START   TIME COMMAND
11+  23812 0.0  0.0  38652  3660 pts/17   R+   17:09   0:00 ps u
11+  28136 0.0  0.0  25828  7284 pts/17   Ss   09:53   0:00 -bash

%CPU, %MEM : 프로세스가 사용하는 CPU, MEMory 사용률

VSZ(virtual set size) : 이미지 프로세스의 크기를 KB단위로 보여줌(프로세스에 할당된 메모리 크기)
RSS(resident set size) : 메모리에서 실행 중인 프로그램의 크기(실제로 사용되는 메모리 크기)

TTY(Teletypewriter) : 일반 CLI console. 컴퓨터에 직접 접속했을 때 연결되는 터미널
  pts(Pseudo TTY Slave) : 원격으로 시스템에 접속할 때 연결되는 터미널

STAT : 프로세스 상태
  R : running
  S : sleep
  + : forground로 실행중

START : 프로세스 실행 시작 시간
TIME : 총 사용 시간(0:00이면 CPU시간을 1초도 사용하지 않음)

 

  • process 정렬이나 표시할 열의 정보를 정할 수 있음. 
  • 일반적으로 PID 기준으로 정렬됨
# -o : 표시할 열의 정보를 지정

$ ps -eo pid,user,vsz,rss,comm | less

  PID USER   VSZ   RSS COMMAND
 6542 11+  38624  3572 ps
 6543 11+  11136  1020 less
28136 11+  25828  7284 bash

# --sort= : 해당 기준으로 정렬. 내림차순 정렬은 -를 붙여서 -rss로 하면 됨

$ ps -o pid,user,vsz,rss,comm --sort=rss | less

  PID USER   VSZ   RSS COMMAND
 6923 11+  11136   968 less
 6920 11+  38624  3724 ps
28136 11+  25828  7284 bash

 

  • 실제로 사용할 때 | less와 함께 사용하면 보기 편함
$ ps ux | less

USER  PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
11+  4498  0.0  0.0  38652  3596 pts/17   R+   17:23   0:00 ps ux
11+  4499  0.0  0.0  11136   944 pts/17   S+   17:23   0:00 less
11+ 27987  0.0  0.0  76992  8052 ?        Ss   09:53   0:00 /lib/systemd/systemd --user
11+ 27988  0.0  0.0 284040  3112 ?        S    09:53   0:00 (sd-pam)
11+ 28109  0.0  0.0 129296  6452 ?        S    09:53   0:00 sshd: 11@pts/17
11+ 28136  0.0  0.0  25828  7284 pts/17   Ss   09:53   0:00 -bash

 

주로 ps aux, ps -ef 를 사용했었는데 다른 옵션들을 사용하면 프로세스를 원하는 대로 볼 수 있구만

man page가 생각보다 길어서 하루에 다 보기 힘들구만ㅠㅠ 

다음에 사용할 일이 있으면 STANDARD FORMAT SPECIFIERS 부터 봐야겠다

 

 

* /proc : 커널 프로세스를 포함하는 각 실행 중인 프로세스들을 위한 디렉토리를 포함. 디렉토리는 /proc/PID라는 이름을 갖는다. 위키백과 자료

* EUID : 영향을 줄 수 있는 UID, 실제 유저는 user1인데 su user2로 로그인하면 user2의 권한을 행사할 수 있음. 이 때 RUID는 user1, EUID는 user2라고 할 수 있음

* TTY

* session leader : PID와 SID가 같으면 이 프로세스를 session leader라고 함.

 

 

 

댓글