나의 즐겨찾기 | 블로그홈 | 바로가기 바로가기 | 로그인
이제 더위는 가고 젤 좋아하는 가을이 온당!!!
블로그  |  사진갤러리  |  동영상갤러리 방명록  |   즐겨찾기 추가
thisrule (thisrule1)
프로필     
 인기도 :
 이 블로그 점수주기
전체 글보기(69)
예준사진 목록
지우사진 목록
리눅스 팁 목록
기본폴더
예준 사진
지우 사진
가족사진
리눅스 팁
가요
설문
오늘 전체
방문자 17 35879
구독자 0 4
댓글 0 10
참조글 1 29
HanRSS 로 구독하기Fish 로 구독하기
2009 11월
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
최근 댓글 전체보기
압축파일에 대한 글 올..
윗글 출처 : 커피닉스..
열심히 하겠습니다
열심히 하겠습니다
열심히 하겠습니다
최근 참조글 전체보기
리눅스의 마스코트는 왜..
다녀간 블로거 더보기
- 소라게
- wonnychung
- 윤노털
- ritzcarltn
- 나에게로
 즐겨찾기
 즐겨찾기 글모음
개설일 : 2004/08/23
 

프로세스란 간단히 말해 리눅스에서 작동하고 있는 프로그램을 말합니다.
프로세스는 컴퓨터의 CPU, 메모리, 디스크 등을 활용하여 작업을 수행하므로, 많은 프로세스를 수행시키려면 그만큼 많은 자원이 필요하게 됩니다. 그러므로, 프로세스를 잘 관리해야 시스템이 최적의 성능을 발휘할 수 있는 것입니다.

이 섹션에서는 프로세스의 개념에 대해 간단히 설명하고 어떻게 프로세스를 모니터링하고 관리하는지, 어떤 사용자가 시스템에 접근하여 시스템의 자원을 활용하는지, 어떤식의 접근을 하고 있는지, 그리고 사용자가 접근하는 디스크 스페이스가 얼마나 되는지등등의 프로세스를 관리하는데 필요한 내용들을 알아보려고 합니다.

프로세스란

프로세스의 생성

프로세스는 어떻게 생성될까요? 사람이 그렇듯이 프로세스는 수행시키려는 부모 프로세스를 가집니다. 이 부모 프로세스가 자신과 동인한 프로세스를 복제(fork)한 후 수행시키려는 내용으로 덮어 씌워 새로운 프로세스가 생성도고, 그 프로세스는 자신이 수행할 임무를 완수하게 되는 것입니다. 모든 임무를 완수한 후에는 종료됩니다. 이런 프로세스는 반대로 자식프로세스라고 하는데, 이들은 부모의 환경을 물려 받아 사용합니다.
각각의 프로세스는 프로세스 ID(PID)를 할당 받게 됩니다.
가장 먼저 실행 되는 프로세스인 init의 PID는 1입니다.

사용자 프로세스(대화형 프로세스)

시스템 사용자들은 쉘을 통해 프로세스를 수행 시킬 수 있습니다.
위에서 언급한 것처럼, 쉘에서 사용자가 프로그램 이름을 입력하면, 쉘은 그 프로그램 이름이 유효한지 확인한 후, 자신을 복제한 새로운 프로세스를 만들고 이 프로세스를 사용자가 지정했던 프로그램으로 바꾸어 이 프로그램에 대한 프로세스를 수행하도록 합니다. 이 프로세스들은 Background와 Foreground 중의 하나로 수행되며, 실행되는 상태를 변경할 수 있습니다.

데몬 (Daemon)

사용자가 생성하는 프로세스들 외에도, 시스템이 시작되는 동안 리눅스 시스템이 실행시키는 프로그램들이 있습니다. 이런 프로세스들은 데몬(Deamon)이라고 부릅니다.
데몬은 백그라운드로 항상 실행되고 있으며 , 지시가 있을 경우에만 종료됩니다. 보통 일반 사용자들은 이 프로세스들을 볼 수 있는 권한이 없습니다.
시스템이 시작 될 때 가장 먼저 실행 되는 프로세스인 init는, 서버 시스템에 대해  보통 inetd 데몬을 수행시키는데, 이 프로세스는 네트워크 관련 서비스 요청이 들어 오는지를 관찰하고 있다가 요청이 들어오면 이들을 위한 프로세스를 실행 시키는 역할을 합니다. 이런 inetd와 같은 프로세스들이 데몬입니다.(Red Hat 7.0부터는 inetd 대신 xinetd라는 데몬을 사용합니다. )
또, sendmail의 경우, 시스템이 전자우편을 위한 설정이 되어 있다면, 메일이 배달 되도록 하기 위해 백그라운드로 계속 실행되고 있습니다. 이런 sendmail 프로세스도 데몬인 것입니다.
프로세스 중 가장 먼저 시작되는 것은 init입니다. 그리고, 이 프로세스에 의해 다른 모든 프로세스들이 시작됩니다. 시작되고 종료되는 데몬들은 runlevel에 따라 달라집니다.

Runlevel

실행레벨은 부팅과 셧다운 되는 동안 어떤 데몬과 서비스들이 시작될 지를 결정합니다. 다음은 많은 배포판들이 사용하고 있는 runlevel의 List와 수행되어야 할 프로세스들이 지정되어 있는 디렉토리입니다.

Runlevel 0

/etc/rc.d/rc0.d

셧다운 절차에 대해 책임 짐. 모든 프로세스들을 종료시키고, 파일시스템을 unmount 하는 작업 포함.

Runlevel 1

/etc/rc.d/rc1.d

단일 사용자 모드. 보통 시스템 관리자가 시스템에 특정 설정을 할 때 사용. 시스템이 이 모드에 있을 때는 다른 사용자들은 로그인 할 수 없다.

Runlevel 2

/etc/rc.d/rc2.d

다중 사용자 모드. 단, NFS를 지원하지 않는다.

Runlevel 3

/etc/rc.d/rc3.d

다중 사용자 모드. 대부분의 배포판에서 기본적인 런레벨로 사용하는 runlevel. 충분히 네트워크가 가능한 리눅스 시스템으로 사용될 수 있도록 대부분의 서비스들이 시작됨.

Runlevel 4

/etc/rc.d/rc4.d

사용자 정의 레벨로 정의될 수 있도록 비어있는 레벨이다.

Runlevel 5

/etc/rc.d/rc5.d

몇몇 배포판에서 그래픽 로그인 프롬프트를 뛰우는 용도로 사용됨. 실행레벨 3에서 시작되는 모든 서비스들이 시작된다. Red Hat은 xdm을 실행시킨다.

Runlevel 6

/etc/rc.d/rc6.d

재실행 모드. 이 실행레벨은 거의 실행레벨 0와 같지만, init.d가 시스템이 재실행 될 것인지, 종료될 것인지를 결정.

 

프로세스 관리

사용자 프로세스들과 데몬들을 모니터링하고, 다시 시작, 혹은 종료 시킬 수 있는 몇가지 방법에 관하여 알아 보도록 하겠습니다.

ps  

현재 실행되고 있는 프로세스들을 리스트로 보여 줍니다. 이 명령은 매우 강력한 명령으로 필요에 따라 다양한 옵션으로 실행시킬 수 있습니다.

옵 션

설   명

a

전체 사용자의 모든 프로세스 출력

e

명령문 실행 후 프로세스 환경 변수 출력

l

제세히 출력

u

사용자 이름과 프로세스 시작 시간을 출력

w

출력결과가 한줄이 넘어도 모두 출력

x

제어하는 터미널이 없는 프로세스 출력

 

다음은 프로세스의 상태를 조회하기 위해 가장 흔하게 사용되는 옵션을 사용한 예입니다.
모든 사용자의 프로세스와 제어하는 터미널이 없는 프로세스들의 사용자 이름과 시작시간을 보함하여 리스트 하라는 명령입니다. TTY가 ?인 것이 제어하는 터미널이 없는 것으로 시스템에서 자체에서 시작된 프로세스들 입니다.

 

출력 결과를 이해하려면 각각의 필드들이 의미하는 것을 알아야 합니다. 다음은 주요 필드들에 대한 설명힙니다.

필 드

설   명

UID

프로세스를 실행시킨 소유자명

PID

Process ID

%CPU

CPU 사용 비율

%MEM

메모리 사용 비율

SIZE

사용중인 가상 메모리 사이즈(KB)

RSS

사용중인 실제 메모리 사이즈(KB)

TTY

실행중인 터미널(tty), 일반적으로 약어로 표시(/dev/tty7 --> p7)

STAT

프로세스의 상태
R : 실행중/실행준비완료
S : sleeping
I : idle
Z : zombie 수행이 종료되어 상위 프로세스의 종료를 기다리는 프로세스
D : disk wait
P : page wait
W : swapped out
N : nice에 의해 우선 순위가 낮아짐
T : 종료
< : 수퍼유저가 우선순위를 높임

START

프로세스 시작 시간/날짜

TIME

프로세스가 사용한 CPU 시간

COMMAND

실행되고 있는 명령

NI

nice 우선순위 번호

PR

프로세스 우선순위 번호

PPID

상위 프로세스의 PID

WCHAN

sleeping 상태의 프로세스가 있는 커널 함수 이름

FLAGS

프로세스와 관련된 숫자 값

 

pstree

pstree는 앞서 언급했던 부모 프로세스와의 관계를 트리 모양으로 보여주는 명령으로, 프로세스의 근원을 비주얼하게 볼 수 있습니다. 프로세스의 실행 옵션을 보거나, 특정 프로세스를 하이라이팅하여 볼 수 있습니다.

 

프로세스에게 말걸기

만일 원하지 않는 프로세스가 진행되고 있다면, 그 프로세스를 중지 시켜야 할 것입니다. 이런 경우에 프로세스에 신호를 보내, 현재 진행중인 정상적인 작업이 아닌 예외 상황을 일으키도록 할 수 있습니다. 이렇게 프로세스에 보낼 수 있는 신호에는 여러 종류가 있습니다. 프로세스를 정지시키거나(STOP), 계속 (CONT), 종료(KILL), 설정파일을 다시 읽어 들이는 (HUP) 등의 신호가 있습니다.

이런 신호를 보낼 때 사용하는 명령이 kill입니다.

이 kill 명령이 프로세스에 보낼 수 있는 신호의 종류는 kill -l 로 확인할 수 있습니다. 여러종류의 신호가 있지만, 일반 사용자들이 쓸 일은 별로 없습니다. 기껏해야, 자신의 프로세스를 종료시키거나, 설정파일을 다시 읽어 들이거나 하는 신호를 보낼 뿐이죠.

프로세스를 종료시키는 신호는 KILL 인데, 신호들은 모두 번호를 가지고 있어서, 다음 두 명령은 같은 결과를 보여줍니다.

    #kill  KILL  1192

    #kill -9  1192

    PID가 1192 번인 프로세스를 종료하라!

kill 명령은 신호를 받을 프로세스를 PID로 지정해 줍니다.
하지만, 일일이 프로세스 번호를 알아낼 필요 없이 프로세스의 이름으로 그 프로세스를 종료시킬 수도 있습니다. 이때 사용하는 명령어가 killall입니다. 이 killall은 편한 만큼 주의를 기울여야 합니다. 자신의 권한(특히 root user의 경우)을 남용하여, 한창 작업중인 다른 사람의 프로세스도 잠재울 수 있으니까요.

 

프로세스 실행에 우선순위 주기

프로세스가 수행되는 데에도 순서가 있습니다. nice 명령으로 이 우선순위를 변경할 수 있는데, 우선순위에는 다음과 같은 규칙들이 있습니다.

    - 일반유저는 우선순위를 낮출수만 있다.
    - 슈퍼유저만이 우선순위를 높일 수 있다.
    - 우선순위의 범위는 -20에서 19까지이다.
    - 적은 수가 우선순위는 높다.

어떤 스크립트에 우선순위를 낮게 주어, 실행시키고자 한다면,

    #nice -n  +10  xxx.pl

과 같은 형식으로 실행시킵니다.
ps 명령 항목 중에, 우선순위와 관계된 두 개의 항목이 있는데, PRI와 NI입니다. 사용자에 의해 변경된 NI값을 바탕으로 실제적인 프로세스의 우선순위인 PRI가 결정되는 것입니다.

각 프로세스의 우선순위를 확인하려면, ps -l  명령을 실행했을 때, NI 항목을 살펴 보십시오.

 

프로세스 모니터링 하기

top

top명령은 CPU를 가장 많이 사용하고 있는 프로세스들을 실시간으로 보여 주는 명령입니다.

첫 번째 행에서 부터,
    - uptime에서 얻은 값으로 시스템의 최근 프로세스 수행수를 평균낸 값,
    - 실행되고 있는 프로세스의 통계값,
    - 프로세스들의 CPU 상용 상태,
    - 메모리 사용상태,
    - 스왑메모리 사용상태를 보여주고 있으며,
그 아래는 ps 명령과 유사한 결과 값으로, 현재 활발한 프로세스의 자원 사용상태를 일목요연하게 나타내고 있습니다.

CPU 사용(P), 메모리 사용(M), 실행시간(T)에 따라 작업들을 정렬해서 볼 수 있습니다. top 명령이 수행되는 동안 h를 누르면 사용가능한 명령들을 볼 수 있습니다.

gtop과 ktop은 X 윈도우에서 같은 기능을 수행합니다.

 

vmstat

 시스템에 관한 다양한 상태를 보여주는 vmstat 명령에서도 프로세스의 정보를 확인 할 수 있습니다.

뒤의 옵션은 1초 간격으로 5번을 디스플레이 하라는 옵션입니다.

첫 번째 항목에 해당하는 procs 부분이 프로세스에 관한 정보로,
    r : 대기 프로세스의 수
    b: blocked된 프로세스의 수
    w: swapped out 된프로세스의 수
를 나타냅니다.

그 외에도, 메모리, 스왑상태, 블록 IO, 시스템, CPU에 대한 정보를 모니터링 할 수 있습니다.

 

원하는 시간에 프로세스 수행하기

원하는 시간에 프로세스를 수행하기 위한 두가지 명령에 대해 설명하려고 합니다.

하나는 간단하게 1회용으로 사용하기 좋은 at이고, 나머지 하나는 늘 반복적으로 수행해야 할 일들을 스케쥴링할 수 있는 cron입니다.

at

앞으로 도래하는 20:00에 echo 명령을 수행하라는 명령입니다. (예가 좀 부적절 한가요?) 명령 입력은 ctrl+D로 종료합니다.

atq는 앞으로 수행될 일들을 알아보는 명령입니다. 위의 예에서는 두 개의 작업이 남아 있습니다.

이 작업들은 /var/spool/at 디렉토리 안에 저장되어 있습니다.

붉은 표시된 파일을 열어보면 그 내용을 볼 수 있습니다.

만일, 예약된 작업을 취소하고 싶은 경우엔, atrm으로 취소합니다.

결과값은 기본적으로는 mail로 보내지며, 명령과 함께 파일을 지정하거나, 출력위치를 지정하면, 원하는 쪽으로 결과값을 내보낼 수 있습니다.

 

cron

 cron 은 수행되어야 하는 프로그램들을 좀 더 체계적으로 계획하고 수행할 수 있는 환경을 제공합니다.
예를 들면, 운영하고 있는 사이트의 데이터베이스를 매일 사용자의 접근이 가장 적은 새벽에 백업하고 싶다던지, 필요없는 파일들을 일정주기에 한번씩 제거한다던지, 로그 파일들을 로테이트 시킨다던지 등등의 일들을, 시스템 관리자가 시간마다 기억하고 수행하지 않아도 될 수 있도록, 수행할 일들에 대한 스케쥴을 짜 놓으면 정해진 시간에 알아서 작업을 수행하는 것입니다. 펄의 창시자 레리월 아저씨의 말처럼 게으른 시스템 관리자는 이런 일들을 일일이 쫓아 다니기 귀찮아, 모든 일을 알아서 시스템이 수행하도록 적당한 프로그램을 짜두고, cron이 실행시킨 결과로 보내주는 리포트나 살피며, 여유있는 생활을 즐길겁니다.  ^^

cron은 부팅시 실행된 crond 데몬에 의해 수행됩니다.

/etc/crontab 파일은 cron 데몬의 기본적인 설정 파일로 다음과 같은 내용을 담고 있습니다.

이중 run-parts 는 뒤에 인수로 넘겨지는 디렉토리에 있는 스크립트들을 실행하는 스크립트로, 매시간, 매일, 매주, 매월 실행 되기 원하는 스크립트를 해당 디렉토리에 넣어 두기만 하면, 별도의 cron 스케쥴을 설정하지 않고, 주기적인 작업을 수행할 수 있습니다.

cron을 설정할 때는 /usr/bin/crontab 명령을 사용합니다.

먼저, 설정된 스케쥴이 있는지 보겠습니다.

없군요!

이제, 새로운 cron을 설정하겠습니다.

vi 에디터가 뜨고, 편집할 수 있는 상태가 되면, 원하는 스케쥴을 입력합니다.

분   시   일   월   주    작업할 스크립트

의 순서로 작성하며, *를 사용하여 전체(매분 매시 매일 매월 매주)를 나타낼 수 있습니다. 하나의 항목에 대해 여러 가지를 지정할 경우에는 ','를 사용합니다.
위의 예는, 매월, 매일, 04시 00분에  /home/backup/backup.sh 라는 스크립트를 실행시키는 스케쥴입니다.
이것을 매주 월요일과, 목요일에 수행하는 것으로 변경하려면,

    00 04 * * 1,4 /home/backup/backup.sh

와 같이, 요일부분을 ','로 구분하여 적어주면 됩니다.

항 목

범 위

기 타

0~59

 

0~23

 

1~31

 

1~12

 

0~7

0과 7은 모두 일요일

이 스케쥴에 대한 기록은 /var/spool/cron 디렉토리 아래에 사용자 별로 남겨지게 되고, cron 데몬이 이 디렉토리로 부터 수행해야할 작업들을 체크하게 됩니다.

스케쥴을 지우고 싶은때에는 -r 옵션을 사용합니다.

 

이상과 같이 프로세스에 관하여 알아보았습니다.

프로세스를 이해하고, 모니터링하고, 이상상태를 파악할 수 있는 능력을 갖추는 것은 시스템 관리자로서 해야할 기본적인 사항입니다. 언젠가 시스템의 이상을 호소하는 사용자들에게 여유있는 대처를 할 수 있도록 충분히 공부하시기 바랍니다.

 

댓글쓰기

댓글쓰기 입력폼

포스트 목록 닫기

목록보기