카테고리 없음

리눅스 프로세스 (Linux Process) - ps, aux, stat, top

seul chan 2021. 4. 19. 00:42

10. Process

모던 os 는 보통 multitasking이다: 빠르게 프로그램을 스위칭하면서 한 가지보다 더 많은 일을 하고 있게 환상을 만드는 것

커널은 이를 process를 통해 관리: 프로세스는 리눅스가 CPU에서 다른 프로그램을 해당 순서까지 기다리게 관리해줌.

시스템이 시작되면 커널은 init이라는 프로그램을 실행시키는 프로세스를 시작함. (/etc에 있는 몇몇의 init script들을 실행)

대부분의 서비스들은 daemon program (유저 인터페이스 없이 백그라운드에서 실행되는 프로그램)

다른 프로그램을 실행시킬 수 있는 프로그램 (parent processchild process를 생성함)

커널은 각각의 프로세스들이 정렬되게 정보를 유지함. ex) 각각의 프로세스는 process ID (PID)라고 불리는 번호를 순서대로 부여받는다. (init이 항상 PID 1)

Viewing process

ps를 보는 가장 흔한 방법은 ps 명령어.

[ec2-user@ip-xxx.xx.xx.xx ~]$ ps
  PID TTY          TIME CMD
 3357 pts/0    00:00:00 bash
 3426 pts/0    00:00:00 ps

default로 ps는 현재 터미널 세션에 관련된 프로세스들만 보여준다.

TTY는 "teletype"의 줄임말로 process의 controlling terminal을 나타낸다. TIME은 해당 프로세스가 사용한 CPU time을 나타냄.

옵션을 사용하면 시스템이 뭘 하고있는지 더 자세히 볼 수 있다.

x option은 터미널과 관계 없이 모든 프로세스를 보여주라는 명령어이다. TTY에 ?는 controlling terminal이 없다는 뜻. 이 명령어로 우리가 사용중인 모든 프로세스를 보여준다.

시스템이 많은 프로세스를 실행하고 있기 때문에 ps는 긴 리스트를 반환한다.

또한 STAT이라는 새로운 열이 생기는데, 이는 state의 줄임말이다

  • R: Running
  • S: Sleeping
  • D: Uninterruptible sleep (disk drive처럼 I/O를 기다리는중)
  • T: Stopped
  • Z: zombie 프로세스. 이미 종료되었지만 parent로부터 정리되지 않은 child process 등
  • <: 우선순위가 높은 프로세스. 프로세스에 중요도를 줘서 더 많은 CPU time을 할당할 수 있다. 이 속성을 niceness라고 부름
  • N: 우선순위가 낮은 프로세스

또 자주 쓰이는 옵션은 aux 옵션이다.

$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0 191708  3172 ?        Ss   Oct13   2:17 /usr/lib/systemd/systemd --switched-root --system --dese
root         2  0.0  0.0      0     0 ?        S    Oct13   0:01 [kthreadd]
root         4  0.0  0.0      0     0 ?        S<   Oct13   0:00 [kworker/0:0H]
root         5  0.0  0.0      0     0 ?        S    Oct13   0:01 [kworker/u96:0]
root         6  0.0  0.0      0     0 ?        S    Oct13  17:41 [ksoftirqd/0]
root         7  0.0  0.0      0     0 ?        S    Oct13   0:07 [migration/0]
root         8  0.0  0.0      0     0 ?        S    Oct13   0:00 [rcu_bh]
root         9  0.0  0.0      0     0 ?        S    Oct13  46:49 [rcu_sched]
...

이 옵션은 모든 유저의 process를 보여준다. (BSD 스타일)

view process dynamically with top

top 명령어는 기계의 현재 상태를 더 동적으로 보여준다.

(기본으로) 매 초마다 상태를 업데이트해준다.

top 명령어의 유래는 주로 시스템의 "top" 프로세스를 보기 위해 사용되는 것으로부터 유래

크게 두가지로 나뉨

  • system summary

  • table of processes

    top - 18:43:04 up 23:09,  0 users,  load average: 0.08, 0.12, 0.15
    Tasks:   2 total,   1 running,   1 sleeping,   0 stopped,   0 zombie
    %Cpu(s):  1.2 us,  4.7 sy,  0.0 ni, 94.1 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    MiB Mem :   1990.8 total,     84.1 free,    848.0 used,   1058.7 buff/cache
    MiB Swap:   1024.0 total,    998.9 free,     25.1 used.   1047.8 avail Mem
    
      PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
        1 root      20   0    4112   3428   2984 S   0.0   0.2   0:00.03 bash
        9 root      20   0    6120   3232   2748 R   0.0   0.2   0:00.00 top
    ...

system summary는 아주 많은 정보를 보여준다.

  • top; 프로그램 이름
  • 18:43:04; 현재 시간
  • up 23:09; uptime이라고 불림. boot되고 지금까지의 시간
  • users; 현재 로그인 된 유저 수
  • load average; 실행되기를 기다리는 프로세스의 수. 첫번째 값은 평균 60초, 두번째는 5분, 세번째는 15분. 1.0 척도이다.
  • Tasks; process stat에 따른 프로세스 수 요약
  • CPU(s);
    • 1.2 us; CPU의 1.2%가 user process (커널 밖에서 실행되는)
    • 4.7 sy; CPU의 4.7%가 시스템 (커널) 프로세스
    • 0.0 ni; CPU의 0.0%가 낮은 우선순위의 프로세스 (nice)
    • 94.1 id; CPU의 94.1%가 놀고있음 (idle)
    • 0.0 wa; CPU의 0.0퍼센트가 I/O를 기다리고 있음

top 프로그램은 몇몇 키보드 명령어를 받을 수 있음. help text인 h와 종료하는 q가 가장 많이 쓰일듯.

Help for Interactive Commands - procps-ng version 3.3.10
Window 1:Def: Cumulative mode Off.  System: Delay 3.0 secs; Secure mode Off.

  Z,B,E,e   Global: 'Z' colors; 'B' bold; 'E'/'e' summary/task memory scale
  l,t,m     Toggle Summary: 'l' load avg; 't' task/cpu stats; 'm' memory info
  0,1,2,3,I Toggle: '0' zeros; '1/2/3' cpus or numa node views; 'I' Irix mode
  f,F,X     Fields: 'f'/'F' add/remove/order/sort; 'X' increase fixed-width

  L,&,<,> . Locate: 'L'/'&' find/again; Move sort column: '<'/'>' left/right
  R,H,V,J . Toggle: 'R' Sort; 'H' Threads; 'V' Forest view; 'J' Num justify
  c,i,S,j . Toggle: 'c' Cmd name/line; 'i' Idle; 'S' Time; 'j' Str justify
  x,y     . Toggle highlights: 'x' sort field; 'y' running tasks
  z,b     . Toggle: 'z' color/mono; 'b' bold/reverse (only if 'x' or 'y')
  u,U,o,O . Filter by: 'u'/'U' effective/any user; 'o'/'O' other criteria
  n,#,^O  . Set: 'n'/'#' max tasks displayed; Show: Ctrl+'O' other filter(s)
  C,...   . Toggle scroll coordinates msg for: up,down,left,right,home,end

  k,r       Manipulate tasks: 'k' kill; 'r' renice
  d or s    Set update interval
  W,Y       Write configuration file 'W'; Inspect other output 'Y'
  q         Quit
          ( commands shown with '.' require a visible task display window )
Press 'h' or '?' for help with Windows,
Type 'q' or <Esc> to continue

mac 의 top은 조금 다르다. ?를 입력하거나 man top으로 문서를 볼 수 있다.

Controlling process

대부분의 터미널에서 실행되고 있는 프로그램들은 CTRL-C로 interrupt 가능하다. 이는 프로그램에게 종료할 것을 공손하게 요청하는 것.

반면 process를 background에서 실행할수도 있다.

[sckim@localhost ~]$ vi &
[1] 29500
[sckim@localhost ~]$

ps 명령어로 떠 있는 것을 볼 수 있다.

[sckim@localhost ~]$ ps
  PID TTY          TIME CMD
29001 pts/0    00:00:00 bash
29500 pts/0    00:00:00 vim
29501 pts/0    00:00:00 ps

jobs 명령어로 현재 터미널에서 실행중인 job들을 볼 수도 있다.

[1]+  Stopped                 vim
[sckim@localhost ~]$ jobs
[1]+  Stopped                 vim

이를 다시 foreground로 불러오려면 fg 명령어를 사용하면 된다.

[sckim@localhost ~]$ fg %1

vim 창이 켜지는 것을 볼 수 있다.

잠시 프로그램을 멈출 수도 있다. 보통 foreground를 background로 보내는 것. CTRL-Z로 background로 보낼 수 있다.

SIGNALS

kill 명령어는 이름처럼 프로세스를 제거하는 명령어.

하지만 실제로 프로세스를 죽이는게 아니라 프로세스에 signals를 보낸다. 시그널은 os가 프로그램과 커뮤니케이션 하는 방식 중 하나이다.

위에서 썼던 CTRL-C, CTRL-Z 명령어도 사실은 각각 INT(interrupt), TSTP(Termianl stop) signal을 프로세스에 보낸 것.

kill 명령어는 option으로 시그널을 선택해서 보낼 수 있다.

kill -signal PID...

주로 사용되는 kill signal 종류는 다음과 같다.

맨날 의미도 잘 모르고 kill -9만 썼던 나 자신을 반성..

  • 1 (HUP): Hang up. 모뎀이나 전화에 물려서 remote computer에 연결되었던 시절의 유산. daemon 프로그램이 reinitialization 할 때 쓰인다 (ex. nginx)
  • 2 (INT): Interrupt. CTRL-C와 같은 효과. 보통 프로그램을 종료시킨다.
  • 9 (KILL): 특별한 시그널. 타겟 프로그램에게 신호를 보내지 않고 커널이 즉각적으로 프로그램을 종료. 이렇게 종료하면 clean up 할 기회가 없기 때문에 다른 종료 시그널이 실패했을 때 마지막 방법으로 쓰는것이 좋다.
  • 18 (TERM): Terminate. kill 명령어에 옵션을 주지 않으면 default로 보내지는 시그널이다.
  • 19 (STOP): Stop. 종료하지 않고 프로세스를 정지시킨다. -9 (KILL) 시그널과 마찬가지로 타겟 프로세스에 보내지지 않기 때문에 무시되지 않는다.
  • 20 (TSTP): Terminal stop. CTRL-Z와 같은 효과. STOP과 비슷한 효과지만 프로그램에게 보내지기 때문에 프로그램이 무시하기로 선택할 수 있음.
root@6d1b96b09793:/# vi &
[1] 611
root@6d1b96b09793:/# kill -1 611

[1]+  Stopped                 vi

killall vi처럼 해당 프로그램을 전부 kill 시킬수도 있다.

다양한 명령어들

  • reboot
  • shutdown
  • pstree: tree-like 패턴으로 관계된 프로세스를 보여줌
  • vmstat: 시스템 리소스를 보여줌. vmstat -5처럼 5초마다 업데이트도 가능