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 psdefault로 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 continuemac 의 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 psjobs 명령어로 현재 터미널에서 실행중인 job들을 볼 수도 있다.
[1]+ Stopped vim
[sckim@localhost ~]$ jobs
[1]+ Stopped vim이를 다시 foreground로 불러오려면 fg 명령어를 사용하면 된다.
[sckim@localhost ~]$ fg %1vim 창이 켜지는 것을 볼 수 있다.
잠시 프로그램을 멈출 수도 있다. 보통 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 vikillall vi처럼 해당 프로그램을 전부 kill 시킬수도 있다.
다양한 명령어들
- reboot
- shutdown
- pstree: tree-like 패턴으로 관계된 프로세스를 보여줌
- vmstat: 시스템 리소스를 보여줌.
vmstat -5처럼 5초마다 업데이트도 가능