서버/Linux I 2016. 1. 25. 20:30

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]# 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: 그런 파일이나 디렉터리가 없습니다

[root@CentOS /test]# ps -l
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

 

 R(Running)

 프로세스가 동작하는 상태

CPU가 처리하는 상태

 T(Waiting)

 프로세스가 중단된 상태

CPU 자원을 할당 못받음

메모리 낭비 요인 가능

 S(Stopped)

프로세스가 실행 중이 아닌 상태 

프로세스가 CPU 자원을 대기하고 있는 상태

메모리에는 올라가 있는 상태

 Z(Zombie)

 프로그램 오류에 의해서 종료되어 잉여된 상태

CPU 자원을 할당 못받음

일정 시간이 지나면 swap 메모리로 옮겨짐

 

 

 - swap 파티션 : 디스크이지만 메모리처럼 사용할 수 있다.(메모리 확보 가능) 단, CPU가 처리하지는 않는다.

                        지금 처리하지 않아도되는 프로세스이거나 좀비 상태인 프로세스는 swap 파티션으로 이동시킨다.

 

 

 

 

2. 프로세스 관리 (Foregroud & Background)

 

 - 프로세스를 관리하기 위해서는 프로세스 실행, 확인, 종료에 관련된 내용과 명령어들을 학습해야 한다.

 - fg(foreground) : 쉘 프롬프트에서 명령어를 실행하여 프로세스가 실행 중이면 쉘 프롬프트를 사용할 수 없다.(볼수 없다.) 

 - bg(backgroun) : 쉘 프롬프트에서 명령어를 실행하여 프로세스가 실행 중이면, 쉘 프롬프트를 사용할 수 있다. (볼수 있다.)

                       

 

(Xwindow 터미널 창에서 확인)

Ex) fg

 

[root@CentOS /test]# gedit
(ctrl+z)


[1]+  Stopped                 gedit


[root@CentOS /test]#
[1]+  죽었음               gedit

 

'gedit' 종료

 

 - '&'가 없으면, Fourground 프로세스로 실행됨

 - 터미널창 사용 못함

 - 프로세스를 중단하고 쉘 프롬프트로 나갈려면,

    ctrl+z 실시

Ex) bg

 

[root@CentOS /test]# gedit &
[1] 14775

 


[root@CentOS /test]#
[1]+  Done                    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 cpuinfo
processor       : 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     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
  2 END=1000000000000000000
  3 while [ $START -le $END ]
  4 do
  5         START=`expr $START + 1`
  6 done

:wq!


[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
  2 do
  3         a=1
  4 done

 

: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
  2
  3 ./cpu1.sh &
  4 sleep 10
  5 ./cpu1.sh &
  6 sleep 10
  7 ./cpu1.sh &
  8 sleep 10
  9 ./cpu1.sh &
 10 sleep 3600
 11
 12 trap 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

 

 

Posted by 김정우 강사(카카오톡 : kim10322)
,


Q