노무현 대통령 배너


2006. 6. 2. 14:37

프로세스 관리

프로세스 관리


개념 및 유형
프로그램은 프로세서가 될 가능성을 간직한 채 디스크에 잠들어 있는 정보를 의미하며 프로세서는 그것이 활동하고 있는 상태를 의미한다.

Process의 생성
하나의 프로세스가 다른 프로세스를 생성할 경우 원래의 프로세스가 더 이상 남아 있을 필요가 없다면 exec 호출을 통하여 자신을 다른 프로그램을 실행하는 새로운 프로세스로 대치될 수 있다.

원래의 프로세스가 계속 존재하려면 fork 호출을 통하여 자신의 복사본 프로세스를 먼저 만들고 복사본 프로세스에서 다시 exec 호출을 통하여 자신을 다른 프로그램을 실행하는 새로운 프로세스를 대치한다.

Process 상태 보기 (ps)
현재 존재하는 프로세스들의 실행 상태를 요약한 보고서를 만들어 준다.

ps 명령어를 파이프와 함께 사용하는 것이 유용할 때가 있다. 보통 다음과 같이 사용함으로써 httpd process가 실행 중인지 확인할 수 있다.

ps aux | grep http [return]

PS 상태에 대한 여러 가지 정보는 다음과 같다

user(BSD) : 프로세스 소유자의 username

uid(sysV) : 프로세스 소유자의 username

pid: 프로세스 식별번호

%CPU : cpu 사용 비율 추정치 (BSD)

%mem : 메모리 사용 비율 추정치 (BSD)

SZ : K 단위 혹은 페이지 단위의 가상 메모리 사용 가능

RSS : 실제 메모리 사용량

TTY : 프로세스와 연결된 터미널 포트

STAT : 프로세스의 현재 상태

R: 실행 중 혹은 실행될 수 있는 상태

S : sleep

I : idle (비활동 상태 : BSD / 중간적 상태 : sysV)

T : 정지된 상태 (suspend)

Z : 좀비 (zombie) 프로세스

D : 디스크 관련 대기 상태 (BSD)

P : 페이지 관련 대기 상태 (BSD)

X : 메모리 확보를 위해 대기 중 (sys V)

K : 사용 가능한 커널 프로세스 (aix)

W : 스왑 out된 상태

N : nice 되어진 상태

> : 우선 순위가 인위적으로 높아진 상태

TIME : 총 cpu 사용 시간

COMMAND : 프로세스의 실행 명령 행

STIME(sysV) : 프로세스가 시작된 시각 혹은 날짜

C(sysV)/CP(BSD) : 짧은 기간 동안의 cpu 사용률

F : 프로세스의 프래그들

PPID : 부모 프로세스의 PID

PRI : 실제 실행 우선 순위

NI : nice

WCHAN : 프로세스를 기다리고 있는 이벤트


Signal 보내기(kill)
프로세스 간의 통신 수단이 signal 이라고 할 수 있다. 하나의 프로세스가 다른 프로세스에게로 메시지를 보내기 위한 수단이다. kill은 프로세스를 죽이는 명령이 아니라 signal 을 보내는 명령이다.

signal

일반적으로 사용되는 signal은 다음과 같다.

이름 번호 의미

HVP 1 Hangup (실행종료. 로그아웃 하거나 모뎀 접속을 끊을 때 보냄)

INT 2 Interrupt (실행종료. ^c를 쳤을 때 보내진다.)

QUIT 3 Quit (실행종료. ^8를 쳤을 때 보내진다.)

KILL 9 Kill (무조건 종료)

SEGV 11 Segmentation Violation (허가되지 않은 메모리 영역에 접근)

TERM 15 Terminate (가능한 한 정상 종료)

CONT18 Continue (STOP나 TSTP에 의해 정지된 프로세스가 다시 실행을 계속한다.)

STOP 19 Stop (무조건적으로 그리고 즉각적으로 정지)

TSTP 20 Stop (실행을 정지 후 다시 실행을 계속하기 위해 대기. ^Z)

kill 명령의 사용법

kill

kill -

Multitasking
Foreground, background & suspend

이 기능으로 하나 이상의 작업을 console에서 사용할 수 있다.

Foreground : 화면에 보여주면서 실행되는 상태(입력을 받아들인다.)

Background : 화면에 보여주지 않으면서 실행되는 상태(입력을 받지 못한다)

Suspend : 메모리에 올라가 있지만 정지된 상태

Foreground로 실행하기

일반적으로 사용하는 방법이 foreground로 실행되는 것이다.

Background로 실행하기

뒤에 &를 붙이면 화면 뒤에서 실행이 된다. 이렇게 실행하면 다른 작업을 동시에 할 수 있지만 vi와 같이 입력을 받아 실행하는 프로그램은 background로 실행될 수 없다.

Foreground를 suspend로 실행하기

^Z을 누르면 실행 중이던 프로그램이 suspend된다. Suspend된 것을 다시 foreground로 하기 위해서는 fg %<작업번호>를 사용한다. 작업번호는 jobs 명령어로 알 수 있다. Suspend된 것을 다시 background로 하기 위해서는 bg %<작업번호> 를 사용한다.

demon
백그라운드로 실행되면서 서버의 역할을 하거나 그 기능을 도와주는 프로세서를 가리키는 말이다. 실행되는 방식에 따라 standalone 방식과 INET 방식이 있다.

standalone

crond httpd inetd …

INET

Telnetd ftpd talkd …

standalone 방식

보통 부팅 시에 실행되는 프로세스로 메모리에 계속 상주해 있으면서 client에게 서비스를 해준다. 서비스 요구가 빈번하거나 항상 요구되어지는 서비스일 경우 이러한 방법으로 수행한다.

INET 방식

Client로부터 요청이 되었을 때 프로세스가 되어 서비스를 해준다. 이러한 demon들은 관리하는 demon이 있는데 그것은 super demon 또는 inet demon 이라 한다. 이 demon은 standalone방식으로 실행되며 INET 방식의 demon들에 대해 tcpwrapper를 작동시킬 수 있다. Tcpwrapper는 INET방식의 demon을 실행할 때 다른 처리 단계를 거칠 수 있게 하므로 보안상의 이점이나 다양한 조절을 할 수 있다.

inet demon

어떠한 서비스를 INET 방식으로 할 것인지를 설정하고 tcpwrapper를 작동시킬 수 있다. Inetd의 설정 파일은 /etc/inetd.conf 이며, RedHat 7.x이상에서는 xinetd로 교체되어, /etc/xinetd.d/ 디렉토리 안에 있는 파일들을 이용하여 설정한다.

프로세스 유틸리티
pstree (프로세스 상관관계 알기)
시스템에서 돌아가고 있는 프로세스들은 서로 연관성을 갖고 실행된다. 프로세스들 간의 연결 구조를 트리 형식으로 출력

[서식]

pstree [-옵션] [프로세스 ID | 사용자]

[주요 사용 옵션]

-a : 명령어에 인수를 넣어 실행했다면 명령어 인수까지 함께 보여준다

-c : 독립적인 하위 트리를 보여주지 않는다. 같은 위치에 같은 프로세스가 있을 때는 합치지 않음.

-h : 현재 프로세스와 부모 프로세스를 좀 더 두드러지게 출력

-l : 특별한 긴 줄이 있어도 그대로 보여줌

-n : PID 순서대로 정렬해서, 같은 부모 프로세스를 가진 자식 프로세스들끼리 모아 출력

-p : PID도 출력

-u : UID도 출력

-G : 프로세스 간의 관계를 보기 좋게 출력

-V : 버전 정보

ps (프로세스 상태 알기)
프로세스라는 것은 현재 실행되고 있는 프로그램들을 가리키는 말

[서식]

ps [-옵션]

[주요 사용 옵션]

-a : 모든 프로세스를 나열

-c : 해당 프로세스를 유발시킨 명령어 이름을 task struct에 참조한다.

-e : 해당 프로세스에 관련된 환경변수 정보를 함께 출력

-f : 프로세스 간 상속관계를 트리 구조를 보여줌

-h : 메뉴는 보여주지 않음. (PID, TTY, STAT, TIME, COMMAND 등)

-j : 작업에 관련된 ID를 출력

-l : j보다 자세하게 정보를 출력

-u : 사용자 이름과 프로세스가 시작된 시간을 출력

-x : 터미널에 종속되지 않는 프로세스들을 출력

-n : 사용자 정보를 ID와 숫자로 표시

-w : 출력 결과를 생략하지 않고 출력

ps + 옵션결과가 출력될 때에 윗 부분에 나타나는 메뉴들의 뜻은 다음과 같다

PID(Process ID) : 프로세스마다 주어지는 번호

TTY(Tele TYpewrite) : 명령어가 실행되는 터미널의 번호

STAT(STATe) : 실행되고 있는 프로세스 상태 (R, S, D, T, Z, W, N)

START(START) : 프로세스가 시작된 시간

TIME(TIME) : CPU가 사용한 시간

USER(USER) : 사용자의 이름

COMMAND(COMMAND) : 사용자가 실행한 명령어

UID(User ID) : 사용자의 ID

PGID(Parent Group ID) : 사용자 부모 프로세스의 그룹 ID

SID(Session ID) : 세션 ID

PRI(PRIority) : 실행하는 우선 순위에 따른 프로세스

NI(Nice) : nice에 의한 우선 순위에 따른 프로세스

RSS(Resident Set Size) : 프로세스가 사용하는 메모리의 크기

SZ(SiZe) : 프로세스가 사용하는 자료와 스택의 크기

SHRD(ShaReD) : 프로세스가 사용하는 공유 메모리

%CPU : 프로세스가 사용하는 CPU 점유율

%MEM : 프로세스가 사용하고 있는 메모리 점유율

WCHAN : 프로세스가 실행하고 있는 커널 루틴

top (CPU 프로세스 상황 보여주기)
top 시스템의 프로세스 수가 얼마이고 몇 개의 프로세스가 돌아가고 있고 어떤 사용자와 데몬들이 있는지, CPU 상태는 어떤지 등에 대한 정보를 실시간으로 보여준다.

[서식]

top

[주요 사용 옵션]

space : 변환된 값을 보여준다.

^L : 화면을 clear한 후에 새로 출력

f : 출력된 정보를 추가적으로 더 선택한다

h / ? : top 에서 사용할 수 있는 명령어와 그에 대한 설명을 출력

k : 지정한 프로세스에 시그널을 보내 프로세스를 끝낼 수 있게 한다.

l : 평균 시스템 부하를 보여주는 기능으로 전환

m : 메모리 정보를 보여주는 기능으로 전환

n / # : 보여주는 프로세스의 개수를 지정

q : top을 종료

r : 지정한 프로세스의 nice값을 재조정

s : 몇 초마다 정보를 갱신할 것인지 결정한다.

t : 합계 정보를 보여주는 기능으로 전환

k : 지정한 프로세스에 시그널을 보내 프로세스를 끝낼 수 있게 한다.

C : 명령어의 전체 경로를 보여주는 기능으로 전환

I : 유휴 프로세스 (idle process)를 보여주는 기능으로 전환

P : CPU 사용률에 따라 정렬

M : 상주 메모리 (resident memory)에 따라 정렬

S : 실행이 끝난 프로세스의 CPU 시간까지 포함하여 프로세스가 점유한총 CPU 시간을 표시

T : 현재 CPU 타임 대 누적 CPU 타임 비율로 정렬

W : 현재 설정을 ~/.toprc 파일에 저장하여 다음 번 실행할 때 현재 설정된 대로 실행되게 함

kill (프로세스 죽이기)
[서식]

kill [-옵션] pid

kill [-옵션] 시그널

[주요 사용 옵션]

-s 시그널 : 특별히 보낼 시그널 지정

-p : 실행중인 프로그램의 이름만을 출력

-l 시그널 : 시그널로 사용할 수 있는 시그널 이름들을 출력. 이것은 /usr/include/linux/signal.h 에서 볼 수 있음.

[사용법]

ps로 실행 중인 프로그램의 id 확인.kill로 실행 중인 프로그램 중단.강제로 실행 중인 프로그램을 종료 시킬 때에는 옵션으로 –9, -SIGKILL, -KILL 등은 사용하면 된다.

자주 사용되는 시그널의 의미

SIGUP : hangup, 로그아웃 하거나 접속을 끊을 때 발생하는 시그널, 특정의 실행중인 프로그램이 이용하는 설정 파일을 변경시키고

변화된 내용을 적용할때 이용

SIGINT : interrupt, 현재 작동 중인 프로그램의 동작을 멈출 때 사용

SIGQUIT : quit, SIGINT와 마찬가지로 종료 키를 누를 때 커널에 의해 보내지는데일반적인 값은 ^c. SIGQUIT는 비정상적인 종료이므로

코어파일을 생성하고 종료한다는 것이 차이이다.

SIGKILL : kill, 무조건 해당 실행 중인 프로그램을 중지.

SIGSEGV : segmentation violation, 메모리 액세스가 잘못 되었을 때 발생

SIGTERM : terminate, 실행중인 프로그램에 정의되어 있는 정상적인 종료방법으로 프로그램을 끝내게 한다. Kill 명령에서 시그널을

특별히 지정하지 않으면 이 시그널을 이용하여 프로그램을 끝낸다.

nice (프로그램 우선순위 변경하기)
각각의 프로세스들에 우선 순위를 부여하여 프로세스를 관리하고자 할 때 이용

[서식]

nice [-n 조정수치] [--adjustment=조정수치] [변수]

[주요사용 옵션]

-n adjustment,

-adjustment, : 명령의 우선권에 10 대선 조정 수치를 더한다.

--adjustment=adjustment

-h : 도움말

-v : 버전 정보

[사용법]

기본적으로 아무런 옵션 없이 nice를 사용하면 상속 받은 현재 순서의 우선권을 출력한다. 옵션으로 조정 수치를 줄 때, 이 값의 범위는 –20~19 까지 이다. 수치가 작을수록 높은 우선 순위를 갖게 된다.

cron 및 crontab
정기적으로 명령이나 프로세스를 스케줄 할 때 cron 프로그램을 쓰며, crontab 파일에 명령을 실행하려는 시간과 날짜를 지정하면 되는데 시간은 분, 시, 일, 월 또는 요일의 항목으로 지정할 수 있다.

cron 프로그램은 시스템이 부트 될 때 한 번만 시작된다. 개별 사용자는 cron 을 직접 실행할 권한이 없다. 또한 시스템 관리자는 명령의 이름을 입력하여 cron을 시작해서는 안 된다. 시스템 부트 순서 중에 실행할 명령 중 하나로서 셀 스크립에 cron을 나열해야 한다.

Crontab을 사용하기 위해서는 아래 형식에 맞춰 입력 파일을 준비해야 한다.

minute hour day month weekday command

minute : 0 ~ 59

hour : 0 ~ 23

day : 1 ~ 31

month : 1~ 12

weekday : 1 ~ 7 (1=Mon, 2=Tue, 3=Wed, 4=Thu, 5=Fri, 6=Sat, 7=Sun)

command : 실행할 명령

명령어의 출력은 사용자에게 mail 유틸리티를 통하여 전송된다. 처음 다섯 항목 중에서 어느 것이라도 숫자 대신에 *를 가지고 있으면 그 항목은 항상 일치되게 되어 있다. % 다음의 문자는 임시 파일에 복사되고 명령의 표준 입력으로 사용된다.

다음은 몇 개의 crontab 파일 들이다.

0 9 * * 1 echo Happy Birthday : Happy Birthday를 월요일 아침 9시에 전자우편으로 전송

* * * * * each One Minute Passed > /dev/tty1 : One Minute Passed를 매 분마다 터미널 장치 /dev/tty1에 보낸다

30 9 1 11 * mail users % Jan Meeting At 10am : 11월 1일 오전 9시 30분에 모든 사용자에게 회의가 있음을 상기시킨다.