10. Process
모던 os 는 보통 multitasking이다: 빠르게 프로그램을 스위칭하면서 한 가지보다 더 많은 일을 하고 있게 환상을 만드는 것
커널은 이를 process
를 통해 관리: 프로세스는 리눅스가 CPU에서 다른 프로그램을 해당 순서까지 기다리게 관리해줌.
시스템이 시작되면 커널은 init
이라는 프로그램을 실행시키는 프로세스를 시작함. (/etc
에 있는 몇몇의 init script들을 실행)
대부분의 서비스들은 daemon program
(유저 인터페이스 없이 백그라운드에서 실행되는 프로그램)
다른 프로그램을 실행시킬 수 있는 프로그램 (parent process
가 child 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
: RunningS
: SleepingD
: Uninterruptible sleep (disk drive처럼 I/O를 기다리는중)T
: StoppedZ
: 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초마다 업데이트도 가능