ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로세스 관리
    linux/centOS 2018. 6. 17. 21:30

    ☆ process(프로세스)

     

    : 프로세스(process)? 실행중인 프로그램이다.

     

     

    DISK(한글.exe) ----> MEM(한글 process) ----> CPU(중앙 처리 장치)

     

     

    프로세스는 프로그램이 메모리에 적재되어 실제로 실행되고 있는 상태를 말한다. 프로세스는 컴퓨터 내에서 실행중인 프로그램의 인스턴스이다. 여러 명의 사용자들에 의해 공유되고 있는 응용프로그램은 일반적으로 각 사용자들의 실행단계에서 하나의 프로세스를 갖는다. 프로세스는 자프로세스라고도 불리는 서브프로세스를 시작시킬 수 있다. 자프로세스는 부프로세스의 복제로서 부프로세스의 자원을 일부 공유하는데, 부프로세스가 종료되면 더 이상 존재할 수 없다. 프로세스들은 몇 가지 IPC 방식을 통하여 정보를 교환하거나 그들의 연산을 동기화할 수 있다.

     

    모든 프로그램은 실행될 때 하나 이상의 프로세스를 갖는다. 하나의 프로세스에는 여러 명령어와 카운트, CPU 레지스터, 그리고 루틴 인자, 복귀 주소, 저장된 변수 등의 테이터 스택이 포함되어 있다. 각 프로세스는 고유의 권한과 책임을 가지고 서로 통신하며, 시스템에서 동작중인 하나의 프로세스가 잘못된 연산을 수행하여 에러를 일으키더라도 다른 프로세스는 정상적으로 작동한다. 개별 프로세스는 자신의 가상 주소 공간에서 실행되며, 커널이 제공하는 인터페이스를 통해서만 다른 프로세스와 연동할 수 있다.

     

    프로세스는 여러 가지 자원을 사용한다. 프로세스는 해당 명령을 수행하기 위해 운영체제에 따라 CPU를 점유할 수 있다. 명령어와 데이터를 저장하기 위해 물리적인 메모리를 사용한다. 프로세스는 운영체제의 제어를 받으면서 실행(running), 대기(waiting), 중단(stopped), 좀비(zombie) 중 한 상태에 있게 된다.

     

     

    (1) 자식프로세스(Child Process) & 부모프로세스(Parent Process)

     

    PID(Process Identification) : 프로세스가 시작할 때 할당받는 프로세스 식별번호

    PPID(Parent Process Identification) : 부모 프로세스 식별번호 (서브 프로세스를 실행시킨 프로세스)

     

     

    # ps

    PID TTY TIME CMD

    7321 pts/3 00:00:00 bash

     

    # bash

    # ps -f

    UID PID PPID C STIME TTY TIME CMD

    root 7321 7319 0 01:19 pts/3 00:00:00 -bash

    root 7354 7321 0 01:19 pts/3 00:00:00 bash

     

     

    ※ Daemon(데몬)이란?

     

    시스템(System)을 위해 또는 서비스(Service)를 위해 백그라운드에서 동작하는 프로세스이다.

    커널상에서 백그라운드 모드로 작동하여 비활성화 상태에서 요청이 있을 때만 동작하는 프로세스를 말한다. 커널상에 백그라운드 모드로 실행되어 작동하지 않고 있을 때는 CPU에 부하를 주지 않지만 메모리의 공간은 차지하고 있으므로 데몬이 커널상에 많이 존재한다면 시스템의 자원을 많이 사용하게 된다.

     

    EX) 웹 데몬 ----> httpd

    메일 데몬 ----> sendmail

    ftp 데몬 ----> vsftpd

    telnet 데몬 ----> telnetd

     

     

    ☆ 프로세스 정보

     

    (1) 프로세스 정보가 존재하는 디렉토리

     

    /proc 라는 디렉토리에 각 프로세스에 해당되는 PID디렉토리들이 있다.

    /proc 라는 디렉토리는 커널 메모리를 마운트 한 것이다.

     

    (2) 프로세스 정보 확인

     

    [명령어 형식]

    # ps /* 현재 터미널에서 실행된 프로세스의 간략한 정보 확인 */

    # ps -l /* 현재 터미널에서 실행된 프로세스의 자세한 정보 확인 */

    # ps -a /* 사용자 프로세스에 대한 간략한 정보 확인 */

    # ps -U <사용자명> (# ps -U user01, # ps -U user01,user02,user03)

    /* 특정한 사용자가 실행시킨 프로세스의 간략한 정보 확인 */

    # ps -t pts/5 /* 특정한 터미널에서 실행시킨 프로세스의 간략한 정보 확인 */

     

    # ps aux | grep xinetd (# ps -ef | grep xinetd)

    # ps -aux | grep xinetd

     

     

     

    [명령어 옵션]

    옵션

    내용

    -e

    모든 프로세스 리스트를 출력한다.

    -f

    프로세스 시작시간, 프로세스의 부모 ID, 그 프로세스에 관련된 사용자 ID, 명령 이름과 가능한 매개변수등 모든 정보를 출력한다. (full format)

    -l

    자세한 정보 보기

    -p (pid)

    지정된 프로세스에 대한 정보를 출력한다.

    -t (tty)

    지정된 터미널에 연관된 프로세스에 대한 정보를 출력한다.

    -u (uid)

    지정된 사용자에 연관된 프로세스에 대한 정보를 출력한다.

    a

    다른 사용자의 프로세스 상태도 표시된다.

    x

    화면에 보이지 않는 프로세스까지 모두 표시

     

     

     

     

    ☆ 프로세스 관리

     

    : 쉘 프롬프트에 명령어를 입력해서 포그라운드 상태($ cat > testfile)로 프로그램을 실행시킴. 그 프로세스가 실행되는 동안 셸 프롬프트를 볼 수 없다. <Ctrl + D>로 프로그램이 종료 되어야 쉘프롬프트 상태로 돌아오게 된다. 백그라운드는 명령행 끝에 &(앰퍼샌드)를 붙여서 사용하면 쉘 프롬프트가 떨어지고 대신 프로세스는 사용자가 보지 않는 상태로 실행된다.

     

    백그라운드 프로세스는 $ bg 명령어로 확인가능 하고 $ fg 명령어로 포그라운드 전환이 가능하다. 반대로 하는 방법은 포그라운드에서 돌아가는 중에 <Ctrl+Z> 으로 멈추고 $ bg 명령을 내리면 된다.

     

    (프로그램이 실행되는 형태)

    (fg) # ls (# gedit )

    (bg) # ls & (# gedit &)

     

     

     

    ☆ 프로세스 종료

     

    : 실행 중인 프로세스를 강제로 종료(인터럽트)시킬 수 있지만 백그라운드에서 실행되는 프로세스는 종료시키지 못하게 된다. 이때 kill 명령을 사용해서 프로세스를 종료시키다. kill명령은 사용자가 프로세스에 일정한 신호를 보내서 프로세스를 종료시킨다, kill -l 명령을 사용하면 신호의 종류를 확인 할 수 있다.

     

    (명령어 형식)

    # kill PID (# kill -15 PID, # kill -TERM PID)

    # kill PID PID PID

    # kill -9 PID (# kill -KILL PID)

    # kill -2 PID (# kill INT PID)

     

    시그널(Signal)? 프로세스가 다른 프로세스에게 보내는 비동기적 알림 메세지

     

    [참고] 일반적으로 많이 쓰이는 시그널(Signal)

    시그널 번호

    시그널 이름

    설 명

    1

    SIGHUP

    프로세스 재시작(HangUp) (EX: # kill -1 450)

    2

    SIGINT

    인터럽트(Interrupt, <Ctrl + C>) (EX: # kill 2 450)

    9

    SIGKILL

    강제 종료(force exit signal) (EX: # kill -9 450)

    15

    SIGTERM

    정상 종료(exit), 기본 시그널 (EX: # kill -15 450)

    kill 명령에 아무 신호도 입력하지 않으면 15번 신호인 SIGTERM을 보낸다. (기본값)

     

     

    # 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 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH

    29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN

    35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4

    39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8

    43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12

    47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14

    51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10

    55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6

    59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2

    63) SIGRTMAX-1 64) SIGRTMAX

     

     

     

    ☆ 프로세스 모니터링

    (1) top 명령 (ps와 같은 명령어 - 차이점? top은 실시간 모니터링)

     

    [참고] 서버에 접속하여 시스템 모니터링

    [TERM1] (TUI) # top (GUI) # gnome-system-monitor

    [TERM2] (TUI) # tail -f /var/log/messages (GUI) # gnome-system-log

     

    실시간으로 프로세스의 상태나 CPU, 메모리, 접속한 사용자의 수 등을 알 수 있게 된다. 시스템의 성능을 확인하려 할 때 많이 사용하게 된다.

     

    기본설정

    명령어 수행 시간 간격(time interval)3 ~ 4

    CPU 사용량별로 정열(Sorting)

     

    (명령어 형식)

    # top

    # top -u oracle /* 해당 사용자의 프로세스 정보를 실시간 모니터링 */

    # top -p PID1,PID2,PID3 /* 해당 번호의 프로세스 정보를 실시간 모니터링 */

     

    (2) lsof(LiSt Open File) 명령어

     

    프로세스에 의해 열려진 파일들에 대한 정보를 볼 수 있다. 특정 파일을 접근하고 있는 프로세스인지 특정 포트로 접속한 사용자를 확인 할 때 유용한 프로세스이다.

     

    [명령어 형식]

    # lsof

    # lsof -p <PID번호>

    # lsof -c <데몬명>

     

     

    [EX] lsof 명령어 실습

    # ps -ef | grep sendmail

    root 7939 1 0 03:06 ? 00:00:00 sendmail: accepting connections

    smmsp 25319 1 0 Jan26 ? 00:00:00 sendmail: Queue runner@01:00:00 for /var/spool/clientmqueue

     

    # lsof -p 7939

    COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

    sendmail 7939 root cwd DIR 8,1 4096 3095078 /var/spool/mqueue

    sendmail 7939 root rtd DIR 8,1 4096 2 /

    sendmail 7939 root txt REG 8,1 806460 928207 /usr/sbin/sendmail.sendmail

    sendmail 7939 root mem REG 8,1 1011184 1140250 /lib/libdb-4.3.so

    ..... (중략) .....

     

    Column

    설 명

    Command

    프로세스와 관련된 Unix command 이름

    PID

    Process IDentification number

    PPID

    Parent Process IDentification number
    (해당 프로세스의 부모 프로세스 ID)

    PGRP

    Process Group IDentification number
    (해당 프로세스와 관련된 프로세스 그룹 ID)

    USER

    해당 프로세스를 소유한 사용자 ID 또는 login name

    FD

    File Descriptor number
    (ex) cwd : current working directory
    r : read access / w : write access / u : read and write access

    TYPE

    해당 파일과 관련한 노드 타입
    (ex) inet : Internet domain socket

    DEVICE

    device number

    SIZE
    SIZE/OFF
    OFFSET

    file 이나 file offset의 사이즈

    INODE
    NODE-ID

    local file node number 또는 Internet protocol type
    또는 서버 호스트의 NFS fileinode number

    NAME

    해당 파일이 소속된 mount point나 파일 시스템의 이름

     

     

    # lsof -i /* 현재 사용하고 있는 모든 소켓 상태를 확인 가능 */

    COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

    portmap 1930 rpc 3u IPv4 5376 UDP *:sunrpc

    portmap 1930 rpc 4u IPv4 5377 TCP *:sunrpc (LISTEN)

    rpc.statd 1962 root 3u IPv4 5552 UDP *:869

    rpc.statd 1962 root 6u IPv4 5529 UDP *:866

    rpc.statd 1962 root 7u IPv4 5559 TCP *:872 (LISTEN)

     

     

    (3) pmap 명령어

     

    프로세스가 사용하고 있는 메모리의 주소를 확인 할 수 있다. 응용프로그램이 실행될 때 얼마나 많은 라이브러리가 로드되는가를 확인 할 수 있다.

     

    [명령어 형식]

    # pmap PID

     

     

    (4) pstree 프로세스 상관도

     

    실행중인 프로세스 상태를 트리 구조로 보여주는 명령어. 프로세스의 부모 자식관계를 형태로 보여주는 명령어

     

    [명령어 형식]

    # pstree (# pstree -l)

    # pstree PID

    # pstree user01

     

    # pstree -l /* 프로세스의 관계를 길게 출력 */

     

     

    (5) pwdx CMD

     

    대상 프로세스의 현재 작업 디렉토리를 얻을 수 있다.

     

     

    (6) nice / renice 명령어

     

    프로세스를 실행하는데 있어서 프로세스에게 우선권을 부여 할 수 있다. 일반적으로 프로세스들은 설정된 우선권 순위대로 실행이 되는데 nice명령을 사용하게 되면 프로세스의 실행 우선권을 바꿀 수 있다. 우선권 순위는 -20에서 19까지의 범위를 가지며 nice 값이 적을수록 우선순위 값이 높아지게 된다.

     

    프로세스의 우선순위: 프로세스가 운영체제의 CPU를 선점할 수 있는 권한

     

    (프로세스의 우선순위를 조정하는 명령어)

    nice 명령어 : 프로그램을 실행할 때 프로세스의 우선순위를 설정할 수 있는 명령어

    renice 명령어 : 실행중인 프로그램의 우선순위를 조정할 수 있는 명령어

     

    # ps -l

    F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

    0 S 0 4768 4744 0 75 0 - 644 wait pts/1 00:00:00 bash

     

    (명령어 형식)

    # CMD (EX: # backup.sh)

    # nice -(-20 ~ 19) CMD (EX: # nice -10 backup.sh (NI: 10))

    # nice -n (-20 ~ 19) CMD (EX: # nice --10 backup.sh (NI: -10))

     

    # renice (-20 ~ 20) PID (EX: # renice 10 PID (NI: 10))

    # renice -n (-20 ~ 20) PID (EX: # renice -10 PID (NI: -10))

     

     

    'linux > centOS' 카테고리의 다른 글

    디렉토리 관리  (0) 2018.06.18
    원격 접속과 파일 전송  (0) 2018.06.18
    shell 특성 3  (0) 2018.06.17
    shell 특성 2  (0) 2018.06.15
    shell 특성 1  (0) 2018.06.14

    댓글

Designed by Tistory.