Linux I - 12. 프로세스 관리
Linux I - 12. 프로세스 관리
login as: root
root@192.168.1.2's password:
Last login: Mon Jan 25 16:53:01 2016 from 192.168.1.1
[root@CentOS /root]#
1. 프로세스 정보 확인
- 프로세스란 프로그램이 메모리에 올라가서 실행되고 있는 상태를 의미하며, 해당 시스템 운영체제 제어를 받는다.
- 각각의 프로그램들을 실행하면 개별적인 프로세스를 할당한다.
- 할당한 프로세스에는 명령어, 카운트, CPU 레지스터, 루틴 인자, 복귀 주소, 저장 변수 등 데이터 스택이 포함되어 있다.
- 시스템에서 동작중인 프로세스가 잘못된 연산을 수행하여 에러가 발생하여도 다른 프로세스에게 영향을 주지 않는다.
- 각각의 프로세스는 가상 주소 공간을 이용하여 실행하며, 커널이 제공하는 인터페이스를 통해 다른 프로세스와 연동한다.
- 명령을 수행하기 위해서 운영체제의 CPU를 점유할 수 있다. 이때, 명령어와 데이터를 저장하기 위해서 메모리를 사용한다.
PID(Process Identification) |
프로세스가 시작 될때, 할당받은 프로세스 식별번호 |
PPID(Parent Process Identification) |
부모 프로세스 식별 번호(서브 프로세스를 실행시킨 프로세스) |
[root@CentOS /root]# cd ..
[root@CentOS /]# mkdir test
[root@CentOS /]# cd test
[root@CentOS /test]#
[root@CentOS /test]# ps 실행중인 전체 프로세스 확인
PID TTY TIME CMD
6499 pts/0 00:00:00 bash
6521 pts/0 00:00:00 ps
[root@CentOS /test]# ps -U root root 계정이 실행한 프로세스 확인
PID TTY TIME CMD
1 ? 00:00:03 init
2 ? 00:00:00 kthreadd
3 ? 00:00:02 migration/0
~ 중간 생략 ~
[root@CentOS /test]# ps -t pts/0 pts/0 터미널로 실행한 프로세스 확인
PID TTY TIME CMD
6499 pts/0 00:00:00 bash
6525 pts/0 00:00:00 ps
[root@CentOS /test]# ps -f 자세한 항목과 함께 실행중인 프로세스 확인
UID PID PPID C STIME TTY TIME CMD
root 6499 6495 0 21:24 pts/0 00:00:00 -bash
root 6528 6499 0 21:24 pts/0 00:00:00 ps -f
[root@CentOS /test]# bash
[root@CentOS /test]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 6499 6495 0 21:24 pts/0 00:00:00 -bash
root 6524 6499 0 21:25 pts/0 00:00:00 bash
root 6533 6524 0 21:25 pts/0 00:00:00 ps -f
UID |
root |
프로세스 실행 사용자 |
PID |
6524 |
프로세스 아이디/식별자 |
PPID |
6499 |
부모 프로세스 아이디 |
C |
0 |
현재 사용되지 않는 필드 |
STIME |
20:57 |
프로세스 실행 시작 시간 |
TTY |
pts/3 |
프로세스가 실행된 터미널 ('?"로 나오면 현재 터미널과 관계 없다는 의미) |
TIME |
00:00:00 |
CPU 사용 누적 시간 (0으로 나오면 CPU 점유 시간이 거의 없다는 의미) |
CMD |
bash |
명렁어 |
[root@CentOS /test]# ps -ef 'e' 옵션을 이용한 모든 프로세스를 출력함
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 16:00 ? 00:00:03 /sbin/init
root 2 0 0 16:00 ? 00:00:00 [kthreadd]
root 3 2 0 16:00 ? 00:00:02 [migration/0]
~ 중간 생략 ~
root 6495 2107 0 21:24 ? 00:00:00 sshd: root@pts/0
root 6499 6495 0 21:24 pts/0 00:00:00 -bash
root 6524 6499 0 21:25 pts/0 00:00:00 bash
root 6535 6524 0 21:25 pts/0 00:00:00 ps -ef
[참고] 데몬(Deamon)
- 시스템 & 서비스를 위해서 커널 백그라운드 모드로 대기하다가, 요청이 있을때만 동작하는 프로세스
- 커널에서 백그라운드 모드로 있기 때문에 CPU 소모는 없지만, 메모리는 사용한다. (메모리 소모 문제 발생)
[root@CentOS /test]# ls /proc
커널 메모리를 마운트한 각 프로세스에 해당되는 PID 디렉토리들을 볼수 있다.
~ 중간 생략 ~ [root@CentOS /test]# ps -l
R(Running) 프로세스가 동작하는 상태 CPU가 처리하는 상태 T(Waiting) 프로세스가 중단된 상태 CPU 자원을 할당 못받음 메모리 낭비 요인 가능 S(Stopped) 프로세스가 실행 중이 아닌 상태 프로세스가 CPU 자원을 대기하고 있는 상태 메모리에는 올라가 있는 상태 Z(Zombie) 프로그램 오류에 의해서 종료되어 잉여된 상태 CPU 자원을 할당 못받음 일정 시간이 지나면 swap 메모리로 옮겨짐
[root@CentOS /test]# ls /proc
1 1918 24 2822 2975 3283 5 7 driver net
10 192 2411 2831 3 3287 50 70 execdomains pagetypeinfo
1017 1939 2426 2834 30 3288 51 78 fb partitions
1790 2107 2611 2885 3132 41 64 asound loadavg tty
18 2175 2620 2887 3134 42 6495 buddyinfo locks uptime
1820 22 2626 2893 3136 43 6499 bus mdstat version
1836 2203 27 2894 3138 44 65 cgroups meminfo vmallocinfo
1852 23 2764 29 3161 45 6524 cmdline misc vmstat
1864 2347 2774 2913 3179 454 6541 cpuinfo modules zoneinfo
1869 2354 2782 2915 3188 46 66 crypto mounts
1885 2372 2783 2919 3189 47 67 devices mpt
19 2382 28 2929 3190 48 68 diskstats mtd
191 2395 2817 2969 32 49 69 dma mtrr
[root@CentOS /test]# ls -ld /proc/6524
dr-xr-xr-x. 8 root root 0 2016-01-25 21:25 /proc/6524
[root@CentOS /test]# exit
exit
[root@CentOS /test]#
[root@CentOS /test]# ps
PID TTY TIME CMD
6499 pts/0 00:00:00 bash
6550 pts/0 00:00:00 ps
[root@CentOS /test]# ls -ld /proc/6524
ls: cannot access /proc/6524: 그런 파일이나 디렉터리가 없습니다
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 6499 6495 0 80 0 - 27117 wait pts/0 00:00:00 bash
4 R 0 6554 6499 0 80 0 - 27032 - pts/0 00:00:00 ps
- swap 파티션 : 디스크이지만 메모리처럼 사용할 수 있다.(메모리 확보 가능) 단, CPU가 처리하지는 않는다.
지금 처리하지 않아도되는 프로세스이거나 좀비 상태인 프로세스는 swap 파티션으로 이동시킨다.
2. 프로세스 관리 (Foregroud & Background)
- 프로세스를 관리하기 위해서는 프로세스 실행, 확인, 종료에 관련된 내용과 명령어들을 학습해야 한다.
- fg(foreground) : 쉘 프롬프트에서 명령어를 실행하여 프로세스가 실행 중이면 쉘 프롬프트를 사용할 수 없다.(볼수 없다.)
- bg(backgroun) : 쉘 프롬프트에서 명령어를 실행하여 프로세스가 실행 중이면, 쉘 프롬프트를 사용할 수 있다. (볼수 있다.)
(Xwindow 터미널 창에서 확인)
Ex) fg
[root@CentOS /test]# gedit
'gedit' 종료
- '&'가 없으면, Fourground 프로세스로 실행됨 - 터미널창 사용 못함 - 프로세스를 중단하고 쉘 프롬프트로 나갈려면, ctrl+z 실시 |
Ex) bg
[root@CentOS /test]# gedit &
'gedit' 종료
- '&'가 있으면, Background 프로세스로 실행됨 - 터미널창 사용 가능 - 실행 중인 프로그램 종료시 프로세스 즉각 종료
|
Ex1) fg & bg 이해 I
[root@CentOS /test]# cat & bg 상태로 프로세스 실행
[1] 15087
Job PID
[root@CentOS /test]# ps -ef | grep cat
root 15087 6499 0 11:27 pts/0 00:00:00 cat
root 15090 6499 0 11:27 pts/0 00:00:00 grep cat
[root@CentOS /test]# ls -ld /proc/15087
dr-xr-xr-x. 8 root root 0 2016-01-26 11:27 /proc/15087
[root@CentOS /test]# fg
cat
(ctrl+c) fg 상태로 프로세스 종료
[root@CentOS /test]# ls -ld /proc/15087
ls: cannot access /proc/15087: 그런 파일이나 디렉터리가 없습니다
Ex2) fg & bg 이해 II
[root@CentOS /test]# sleep 1000 fg 상태로 프로세스 실행
(ctrl+z) 프로세스를 Stop하고, 쉘 프롬프트로 나가기
[1]+ Stopped sleep 1000
[root@CentOS /test]# sleep 2000
(ctrl+z)
[2]+ Stopped sleep 2000
[root@CentOS /test]# sleep 3000
(ctrl+z)
[3]+ Stopped sleep 3000
[root@CentOS /test]# jobs
[1] Stopped sleep 1000
[2]- Stopped sleep 2000
[3]+ Stopped sleep 3000
[root@CentOS /test]# bg 1 bg 상태로 전환
[1] sleep 1000 &
[root@CentOS /test]# bg 2
[2]- sleep 2000 &
[root@CentOS /test]# bg 3
[3]+ sleep 3000 &
[root@CentOS /test]# jobs
[1] Running sleep 1000 &
[2]- Running sleep 2000 &
[3]+ Running sleep 3000 &
[root@CentOS /test]# fg 1 fg 상태로 전환
sleep 1000
(ctrl+c) fg 상태로 프로세스 종료
[root@CentOS /test]# fg 2
sleep 2000
(ctrl+c)
[root@CentOS /test]# fg 3
sleep 3000
(ctrl+c)
[root@CentOS /test]# jobs
[root@CentOS /test]#
3. 프로세스 종료 (Kill)
실행 중인 프로세스를 강제로 종료시킬 수 있지만, 백그라운드에서 실행되는 프로세스는 종료할 수 없다. 이때, 'kill' 명령어를 이용하여 프로세서에게 특정 신호를 전송하여 프로세스를 강제로 종료할 수 있다. 'kill' 신호 유형은 다음과 같으며, '1', '2', '9', '15', '20' 5가지 신호는 자주 사용하는 신호이다.
[root@CentOS /test]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
~ 중간 생략 ~
1) SIGHUP |
프로세스 재실행 (프로세스 종료 -> 재실행) |
2) SIGINT |
현재 프로세스 강제 종료 (ctrl+c) |
9) SIGKILL |
프로세스 강제 종료 (만약, 프로세스가 처리하는 일이 있다면, 종료됨) |
15) SIGTERM |
프로세스 정상 종료 (만약, 프로세스가 처리하는 일이 있다면, 종료 안됨) |
20) SIGTSTP |
현재 프로세스 강제 중단 (ctrl+z) |
[root@CentOS /test]# whereis sleep
sleep: /bin/sleep /usr/share/man/man3/sleep.3.gz /usr/share/man/man1/sleep.1.gz /usr/share/man/man3p/sleep.3p.gz /usr/share/man/man1p/sleep.1p.gz
- 'sleep'이란 통신 및 프로세스 처리 중 잠시 대기 상태를 만들기 위해서 사용하는 명령어
Ex1) 'kill' 명령어 이해 I
[root@CentOS /test]# sleep 1000 &
[1] 16104
[root@CentOS /test]# sleep 2000 &
[2] 16105
[root@CentOS /test]# sleep 3000 &
[3] 16106
[root@CentOS /test]# ps
PID TTY TIME CMD
15994 pts/0 00:00:00 bash
16104 pts/0 00:00:00 sleep
16105 pts/0 00:00:00 sleep
16106 pts/0 00:00:00 sleep
16107 pts/0 00:00:00 ps
[root@CentOS /test]# kill -9 16104 '9) SIGKILL' 시그널
[1] 죽었음 sleep 1000
[root@CentOS /test]# kill -KILL 16105 '9) SIGKILL' 시그널
[2]- 죽었음 sleep 2000
[root@CentOS /test]# kill 16106 '15) SIGTERM' 시그널
[3]+ 종료됨 sleep 3000
[root@CentOS /test]# ps
PID TTY TIME CMD
15994 pts/0 00:00:00 bash
16110 pts/0 00:00:00 ps
Ex2) 'kill' 명령어 이해 II
[root@CentOS /test]# sleep 1000 &
[1] 16337
[root@CentOS /test]# sleep 2000 &
[2] 16338
[root@CentOS /test]# sleep 3000 &
[3] 16340
[root@CentOS /test]# jobs
[1] Running sleep 1000 &
[2]- Running sleep 2000 & '-' fg 상태 두번째 프로세스
[3]+ Running sleep 3000 & '+' fg 상태 첫뻔째 프로세스
[root@CentOS /test]# fg %1 Job ID 1로 fg 상태로 전환
sleep 1000
(ctrl+z) 프로세스를 Stop하고, 쉘 프롬프트로 나가기
[1]+ Stopped sleep 1000
[root@CentOS /test]# jobs
[1]+ Stopped sleep 1000
[2] Running sleep 2000 &
[3]- Running sleep 3000 &
[root@CentOS /test]# bg %1 Job ID 1로 bg 상태로 전환
[1]+ sleep 1000 &
[root@CentOS /test]# jobs
[1] Running sleep 1000 &
[2]- Running sleep 2000 &
[3]+ Running sleep 3000 &
[root@CentOS /test]# killall -9 sleep 'sleep' 이름을 갖고 있는 모든 프로세스를 종료시킴
[1] 죽었음 sleep 1000
[2]- 죽었음 sleep 2000
[3]+ 죽었음 sleep 3000
[root@CentOS /test]# jobs
[root@CentOS /test]# ps
PID TTY TIME CMD
15994 pts/0 00:00:00 bash
16350 pts/0 00:00:00 ps
4. 프로세스 모니터링
프로세스 모니터링 명령어를 이용하면 실시간으로 프로세스 상태, CPU, 메모리, 접속한 사용자 현황을 확인할 수 있다.
Ex1) 정적인 시스템 정보 확인
[root@CentOS /test]# cd /proc
[root@CentOS /proc]# cat cpuinfoprocessor : 0
vendor_id : AuthenticAMD
cpu family : 21
model : 2
~ 중간 생략 ~
[root@CentOS /proc]# cat meminfo
MemTotal: 2046532 kB
~ 중간 생략 ~
[root@CentOS /proc]# ps -efl
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 4841 poll_s Jan25 ? 00:00:03 /sbin
1 S root 2 0 0 80 0 - 0 kthrea Jan25 ? 00:00:00 [kth]
1 S root 3 2 0 -40 - - 0 migrat Jan25 ? 00:00:02 [mig]
[root@CentOS /proc]# cd -
/test
[root@CentOS /test]#
Ex2) 'top' 명령어를 이용한 실시간 프로세스 정보 확인
[root@CentOS /test]# top
① top - 14:41:35 up 22:41, 3 users, load average: 0.00, 0.02, 0.07
② Tasks: 195 total, 1 running, 194 sleeping, 0 stopped, 0 zombie
③ Cpu(s): 0.0%us, 0.1%sy, 0.0%ni, 99.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
④ Mem: 2046532k total, 1210340k used, 836192k free, 102692k buffers
⑤ Swap: 4095996k total, 0k used, 4095996k free, 646976k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
16596 root 20 0 15032 1176 828 R 3.5 0.1 0:00.08 top
1 root 20 0 19364 1536 1224 S 0.0 0.1 0:03.90 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.07 kthreadd
3 root RT 0 0 0 0 S 0.0 0.0 0:02.08 migration/0
4 root 20 0 0 0 0 S 0.0 0.0 0:00.29 ksoftirqd/0
~ 중간 생략 ~
① 시스템 현재 시간, 시스템 부팅 이후 작동한 시간, 사용자 수, CPU 로드 평균값
② 시스템에서 동작하는 프로세스 상태(running, sleeping, stopped, zombie)
③ CPU 상태
④ 총 사용 가능한 메모리, 현재 사용중인 메모리, 사용 가능한 메모리, 버퍼로 사용된 메모리
⑤ Swap 총 사용 가능한 메모리, 현재 사용중인 Swap 메모리, 사용 가능한 Swap 메모리, 캐시 메모리
Ex3) 'pstree'를 이용한 프로세스 트리 구조 확인 I
[root@CentOS /test]# pstree
init─┬─NetworkManager─┬─dhclient
│ └─{NetworkManager}
├─abrtd
├─acpid
├─atd
~ 중간 생략 ~
Ex4) 'pstree'를 이용한 프로세스 트리 구조 확인 II
[root@CentOS /test]# su - user1
[user1@CentOS /home/user1]$ ps -f
UID PID PPID C STIME TTY TIME CMD
user1 17580 17579 0 16:41 pts/0 00:00:00 -bash
user1 17603 17580 1 16:41 pts/0 00:00:00 ps -f
[user1@CentOS /home/user1]$ sleep 1000 &
[1] 17604
[user1@CentOS /home/user1]$ sleep 2000 &
[2] 17605
[user1@CentOS /home/user1]$ bash bash 프로세스 하나 더 실행(부모 프로세스)
[user1@CentOS /home/user1]$ sleep 3000 & sleep 3000 프로세스 실행 (자식 프로세스)
[1] 17620
[user1@CentOS /home/user1]$ sleep 4000 & sleep 4000 프로세스 실행 (자식 프로세스)
[2] 17621
[user1@CentOS /home/user1]$ ps -f
UID PID PPID C STIME TTY TIME CMD
user1 17580 17579 0 16:41 pts/0 00:00:00 -bash
user1 17604 17580 0 16:41 pts/0 00:00:00 sleep 1000
user1 17605 17580 0 16:41 pts/0 00:00:00 sleep 2000
user1 17606 17580 0 16:41 pts/0 00:00:00 bash
user1 17620 17606 0 16:41 pts/0 00:00:00 sleep 3000
user1 17621 17606 0 16:41 pts/0 00:00:00 sleep 4000
user1 17622 17606 0 16:41 pts/0 00:00:00 ps -f
[user1@CentOS /home/user1]$ pstree -u user1
bash─┬─bash─┬─pstree
│ └─2*[sleep]
└─2*[sleep]
[user1@CentOS /home/user1]$ exit bash 프로세스 종료(부모 프로세스)
exit
[user1@CentOS /home/user1]$ ps -f
UID PID PPID C STIME TTY TIME CMD
user1 17580 17579 0 16:41 pts/0 00:00:00 -bash
user1 17604 17580 0 16:41 pts/0 00:00:00 sleep 1000
user1 17605 17580 0 16:41 pts/0 00:00:00 sleep 2000
user1 17620 1 0 16:41 pts/0 00:00:00 sleep 3000 부모 프로세스가 종료되어, init 프로세스로 넘어감
user1 17621 1 0 16:41 pts/0 00:00:00 sleep 4000
user1 17625 17580 0 16:41 pts/0 00:00:00 ps -f
[user1@CentOS /home/user1]$ pstree -u user1
sleep
sleep
bash─┬─pstree
└─2*[sleep]
[user1@CentOS /home/user1]$ killall sleep
[1]- 종료됨 sleep 1000
[2]+ 종료됨 sleep 2000
[user1@CentOS /home/user1]$ ps -f
UID PID PPID C STIME TTY TIME CMD
user1 17580 17579 0 16:41 pts/0 00:00:00 -bash
user1 17629 17580 0 16:41 pts/0 00:00:00 ps -f
[user1@CentOS /home/user1]$ exit
logout
[root@CentOS /test]#
Ex5) 'gnome-system-monitor'를 이용한 모니터링
- GUI 기반이기 때문에 Xwindow에서 실행해야 한다.
Xwindow 터미널 창
[root@CentOS /root/바탕화면]# gnome-system-monitor & |
Xwindow 'gnome-system-monitor' 확인
5. CPU 부하 발생 테스트
스크립트를 이용하여 CPU 부하를 발생하여 gnome-system-monitor 내용을 확인하도록 한다.
Ex1) CPU 부하 발생 테스트 I
[root@CentOS /test]# vi cpu1.sh
1 START=0 |
[root@CentOS /test]# chmod 755 *.sh
[root@CentOS /test]# ./cpu1.sh
Xwindow 'gnome-system-monitor' 확인
[root@CentOS /test]# ./cpu1.sh
(ctrl+c)
[root@CentOS /test]#
Ex2) CPU 부하 발생 테스트 II
[root@CentOS /test]# vi cpu2.sh
1 while true
:wq! |
[root@CentOS /test]# chmod 755 *.sh
[root@CentOS /test]# ./cpu2.sh
Xwindow 'gnome-system-monitor' 확인
[root@CentOS /test]# ./cpu2.sh
(ctrl+c)
[root@CentOS /test]#
Ex3) CPU 부하 발생 테스트 III
[root@CentOS /test]# vi cpu3.sh
1 trap 'killall cpu.sh ; exit 1' 2 3
:wq! |
[root@CentOS /test]# chmod 755 *.sh
[root@CentOS /test]# ./cpu3.sh
Xwindow 'gnome-system-monitor' 확인
[root@CentOS /test]# ./cpu3.sh
(ctrl+c)
[root@CentOS /test]#
[root@CentOS /test]# rm -f cpu*
[root@CentOS /test]# ls
[root@CentOS /test]# reboot