2012년 9월 5일 수요일

리눅스 프로세스 관리와 관련 명령어

1. 프로세스(Process) 관리

(1) 개요 


  리눅스는 한번에 수백개이상의 프로그램을 동시 수행할 수 있다. 이러한 하나하나의 프로그램을 프로세스라 부르며 내부적으로 번호가 붙어 관리된다. 프로세스는 크게 두 가지로 나눌 수 있는데, 사용자의 입력에 관계없이 실행되는 background process와 입력 후 수행종료까지 기다리는 foreground process가 있다.


(2) 프로세스의 종류

1) 포그라운드(Foreground) 프로세스


ㄱ. 설명
  일반적으로 쉘상태에서 명령을 내리면 해당 프로세스가 종료될 때까지 기다려야 한다.
이러한 프로세스를 포그라운드 프로세스라 한다.


ㄴ. 사용예
[posein@www posein]$ find / -name '*.txt' 2>/dev/null > list.txt
=> 이 경우 find 결과가 list.txt라는 파일에 저장할 때까지 사용자는 다른 작업을 할 수 없게 된다.


2) 백그라운드(background) 프로세스


ㄱ. 설명
  기존의 포그라운드 명령뒤에 '&'를 붙인다.


ㄴ. 사용예 
[posein@www posein]$ find / -type d 2>/dev/null > list.txt &


[1] 1742
=> 여기서 [1]은 작업번호(job number)이고, 1742는 PID(Process ID)이다.



(3) 작업수행의 전환

1) background --> foreground : background로 수행될 때 'fg'라고 명령을 내리면 전환된다.
2) foreground --> background : [CTRL] + [Z] (suspend 모드)를 눌러 작업을 일단 중지시킨뒤 'bg' 라고 명령을 내린다.


(참고) 인터럽트키 
[CTRL] +[C] : 작업취소
[CTRL] +[D] : 작업 정상 종료
[CTRL] +[Z] : 작업 대기


(4) 현재 작업중인 process의 확인 

 'jobs'라고 명령을 내리면 된다. + 기호로 표시된 작업이 먼저 실행되는 job이고 -기호가 그다음이다.


(5) process를 중지시키기

  kill명령을 이용하여 중지, 종료 등을 할 수 있다.


1) 사용법
kill %job_number


2) 사용예


ㄱ. 작업의 중지
kill %1 
=> job번호가 1인 작업을 중지 시킨다. 


ㄴ. 작업의 강제종료시키기
kill -9 %1 => job번호가 1인 작업을 강제 종료시킨다.
(참고) kill 명령은 job번호와 PID(process ID)모두 사용가능하다. job번호는 앞에 %를 붙여서
구분하고 PID인 경우에는 그냥 번호만 쓴다.

2. 관련명령어

(1) ps(process status)

1) 설명
  현재 프로세스들의 상태를 PID(Process ID)와 함께 보여준다. 리눅스에서는 사용자와 
파일 뿐만아니라 프로세스도 번호로 관리한다.


2) 사용법 
ps [option(s)]


3) option
-a : 다른 사용자에 의해서 생성된 프로세스들도 보여준다. (u,x옵션과 연계해서 사용한다.)
-u : 프로세스의 소유자에 대한 정보 등 매우 자세하게 보여준다.
-l : 프로세스의 정보를 옆으로 길게 보여준다. (우선순위값과 관련된 PRI와 NI값을 확인할 수 있다. 
-x : daemon process등 터미널의 컨트롤과 관련이 없는 프로세스도 보여준다. 일반적으로 말하는 데몬프로세  스도 보여준다. 보통 ps명령을 실행하면 현재 Shell의 자식 프로세스들만 보여주는데, 이 옵션으로 다른 프로세스들도 볼 수가 있다. (BSD계열) System V계열인 경우에는 -x대신에 -e를 사용할 수 있고, -u 대신에 -uf옵션을 사용할 수 있다.
-e : 해당 프로세스에 관련된 환경변수 정보를 함께 출력한다.
-f : 프로세스 간의 상속관계를 보여준다.(PID, PPID값이 표시된다.)


(참고2) daemon process
daemon process란 daemon(악마)처럼 앞에 나타나지 않고 사용자가 모르게 뒤에서 시스템의 관리
를 위해 움직이는 프로세스를 말한다. 보통 시스템이 부팅이 될 때 자동적으로 실행이 된다. 
ftpd, inetd, lpd, nfsd 등이 있다.


4) 사용예


ㄱ. [posein@www posein]$ ps
PID TTY TIME CMD
23563 pts/0 00:00:00 bash
23594 pts/0 00:00:00 ps


ㄴ. ps -au 
=> 현재 시스템상의 process들 중 터미널과 관련이 있는 모든 process들을 소유자 정보와 함께 보여준다. 


ㄷ. [posein@www posein]$ ps -aux |more
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 1368 548 ? S May02 0:04 init [3]
root 2 0.0 0.0 0 0 ? SW May02 0:00 [keventd]
=> 현재 시스템상에서 움직이고 있는 모든 process들을 소유자의 정보와 함께 보여준다.


ㄹ. [posein@www posein]$ ps -ef |more
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 May02 ? 00:00:04 init [3]
root 2 1 0 May02 ? 00:00:00 [keventd]
=> sysV 계열에 사용하는 옵션형태로 내용은 위와 비슷하다. 참고로 ps옵션에서 BSB계열의 -aux와 SYSTEM V계열의 -ef옵션은 거의 유사하다. 리눅스에서는 현재 이 두계열의 옵션 모두 지원한다.


ㅁ. [posein@www posein]$ ps -aux |grep sendmail
root 743 0.0 0.4 5580 2208 ? S May09 0:04 sendmail: accepti
smmsp 753 0.0 0.3 4852 1900 ? S May09 0:00 sendmail: Queue r
=> 현재 시스템상의 프로세스중 sendmail의 프로세스를 보여준다.


ㅂ. [posein@www posein]$ ps -aux |grep posein
root 27264 0.0 0.2 2216 1152 ? S 21:39 0:00 login -- posein
posein 27265 0.0 0.2 5496 1432 pts/0 S 21:39 0:00 -bash
posein 27398 0.0 0.1 2700 732 pts/0 R 21:50 0:00 ps -aux
=> 현재 시스템상의 프로세스중 posein 이라는 사용자의 프로세스를 보여준다.


5) ps상태보기
USER : BSD 계열에서 나타나는 항목으로 프로세스 소유자의 USERNAME
UID : SYSTEM V계열에서 나타나는 항목으로 포로세스 소유자의 USERNAME
PID : 프로세스의 식별번호
%CPU : CPU사용비율의 추정치(BSD)
%MEM : 메모리 사용비율의 추정치(BSD)
VSZ : K단위 또는 페이지 단위의 가상메모리 사용량
RSS : 실제 메모리 사용량. Resident Set Size
TTY : 프로세스와 연결된 터미널
STAT : 현재 프로세스의 상태


- 값
R : 실행 중 혹은 실행될 수 있는 상태
S : sleep상태 (보통 20초이상된 상태)
I : idle(비활동상태 : BSD, 중간적상태 : sysV) (보통 20초이하의 대기상태)
T : 정지된 상태(suspend)
Z : 좀비(zombie)프로세스
D : 디스크 관련 대기상태(BSD)
P : 페이지 관련 대기상태(BSD)
X : 메모리 확보를 위한 대기 상태(sysV)
K : 사용가능한 커널 프로세스(AIX)
W : 스왑 OUT된 상태
N : nice되어진 상태
> : 우선순위가 인위적으로 높아진 상태
START : 프로세스 시작 시간 또는 날짜
TIME : 총 CPU사용시간
COMMAND : 프로세스의 실행 명령행
STIME(sysV) : 프로세스가 시작된 시간 혹은 날짜
C(sysV), CP(BSD) : 짧은 기간 동안의 CPU사용률
F : 프로세스의 플래그들
PPID : 부모 프로세스의 PID
PRI : 실제 실행 우선 순위
NI : nice 우선순위 번호
WCHAN : 프로세스를 기다리고 있는 이벤트
PLAGS : 프로세스와 관련된 숫자 값

(2) kill 

1) 설명: 프로세스에 특정한 signal을 보내는 명령이다. 보통 실행중인 프로세스에 종료 신호를
보낸다. 보통 중지시킬 수 없는 프로세스를 종료시킬때 많이 사용한다.


2) 사용법
kill [option] [-시그널번호 or -시그널이름] PID
=> kill 명령 뒤에 어떤 프로세스의 PID(Process ID)를 적어주면 그 프로세스에 종료시그널을
보내게 된다. 보통의 경우 종료시킬 수 있으며, 만약에 종료되지 않으면 9를 signal_number
에 써 줌으로써 강제로 종료시킬 수 있다.
kill [option] [-시그널번호 or -시그널이름] %작업번호


3) option
-l : 시그널의 종류를 나열한다. 시그널의 종류는 시그널 번호순서대로 나열한다.


4) signal_number와 이름
1 SIGHUP(HUP) : hang up의 약자로 프로세스를 재시작시키는 시그널이다.
2 SIGINT(INT) : 인터럽트. 실행을 중지시킨다. [CTRL] + [C] 를 눌렀을 때 보내지는 시그널
이다.
3 QUIT : 실행중지. 
9 SIGKILL(KILL) : 무조건 종료, 즉 강제 종료시키는 시그널이다.
15 SIGTERM(TERM) : Terminate의 약자로 가능한 정상 종료시키는 시그널로 kill 명령의 기본
시그널이다.
18 CONT : Continue. STOP등에 의해 정지된 프로세스를 다시 실행시킨다.
19 STOP : 무조건적, 즉각적 정지
20 TSTP : 실행 정지후 다시 실행을 계속하기 위하여 대기시키는 시그널이다. [CTRL] +[Z] 를 
눌렀을 때 보내지는 시그널이다.

5) 참고 
kill -l 이라고 써주면 signal_number에 보내줄 수 있는 시그널의 종류들을 보여주며, signal_
number에 숫자 대신에 직접 이름을 써 주어도 된다. man 을 참조하려면 man 7 signal 하면 된다.


6) 사용예
ㄱ. kill -l 
=> 시그널의 종류를 나열한다.
ㄴ. kill 724 
=> 724번 프로세스에 디폴트시그널인 15번 시그널을 보낸다. 
같은 명령으로 'kill -15 724', 'kill -TERM 724'등이 있다. 
ㄷ. kill -9 756 757 758 
=> pid가 756, 757,758인 프로세스를 중단한다. 'kill -KILL PID', 'kill -SIGKILL PID'
라고 명령내려도 된다.
ㄹ. kill -HUP 10118 
=> pid가 10118인 프로세스를 재시작한다. 'kill -1 10118'과 같다.
ㅁ. kill %2
=> 작업번호가 2인 프로세스를 종료시킨다.


7) 프로세스 종료시 유의점
프로세스를 종료시에는 [CTRL] +[C]나 기본시그널인 TERM 시그널(-15)로 정상적으로 종료를 
시도하는 것이 좋다. 그래도 프로세스가 종료가 안되면 KILL 시그널(-9)을 사용하면 된다.

(3) killall 

1) 설명: 같은 데몬의 여러 프로세스를 한번에 죽이는 경우에 사용한다. Killall은 프로세스이름
으로 프로세스를 종료시킨다.


2) 사용법
killall [option] 프로세스명


3) option
-HUP : 재시작한다. 


4) 사용예 
ㄱ. killall httpd 
=> Apache 웹서버 데몬을 모두 종료한다.
ㄴ. killall mysql
=> mysql 데몬을 모두 종료한다. 
ㄷ. killall -HUP xinetd 
=> xinetd 데몬을 다시 실행시킨다.

(4) pstree

1) 설명 : 프로세스들을 계층적인 트리구조 형태로 출력해준다.


2) 사용법
pstree [option]


3) option
-a : 각 프로세스의 명령행 인자까지 보여준다. 
-h : 현재 프로세스와 그것의 조상 프로세스를 하이라이트로 강조해서 보여준다.
-n : PID 값으로 정렬해서 보여준다. 기본값은 이름으로 출력한다.
-p : PID 값을 같이 보여준다.


4) 사용예
[posein@www posein]$ pstree
init-+-apmd
|-atd
|-automount
|-bdflush
|-crond---crond---run-parts---awk
|-eth0
|-eth1
|-gpm
|-httpd---10*[httpd]
=> (결과설명)
최초로 실행되는 프로세스인 init가 왼쪽 상단에 나타나며 자식 프로세스는 오른쪽에 위치
한다. 또한 프로세스앞에 n*은 실행되고 있는 프로세스의 갯수이다. 

(5) top 

1) 설명: 현재시스템의 프로세스 상태를 연속적으로 화면에 보여준다. 


2) 사용법
top [option]


3) option
-d 갱신시간 : 화면 갱신시간을 설정
-q : 화면을 계속 갱신한다.
-i : idle상태와 zombie 프로세스를 무시한다.


4) 사용예 
[root@www root]# top
1:17am up 1 day, 13:06, 3 users, load average: 0.00, 0.00, 0.00
68 processes: 66 sleeping, 2 running, 0 zombie, 0 stopped
CPU states: 0.0% user, 0.0% system, 0.0% nice, 100.0% idle
Mem: 513064K av, 363976K used, 149088K free, 0K shrd, 161724K buff
Swap: 265032K av, 0K used, 265032K free 49916K cached

PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND
1 root 8 0 544 544 472 S 0.0 0.1 0:04 init
2 root 8 0 0 0 0 SW 0.0 0.0 0:00 keventd
3 root 9 0 0 0 0 SW 0.0 0.0 0:00 kapm-idled
4 root 9 0 0 0 0 SW 0.0 0.0 0:00 kswapd
5 root 9 0 0 0 0 SW 0.0 0.0 0:00 kreclaimd
5) top 항목설명 
PID : Process ID
PPID : Parent Process ID
UID : 소유자의 User ID
USER : 소유자
PRI : Priority(우선순위)
NI : Nice Value ( -20 ~ 19 사이의 값으로 작을 수록 우선순위가 높아짐)
SIZE : 프로세스의 코드와 데이터의 크기(KB단위)
TSIZE : 프로세스의 코드 사이즈
DSIZE : 프로세스의 데이터 사이즈
SWAP : 프로세스가 swap한 메모리양
RSS : 프로세스가 사용하는 실제 메모리양
SHARE : 프로세스가 사용하는 공유 메모리의 양'
STAT : 현재 프로세스의 상태를 나타낸다.
LIB : 라이브러리 페이지의 크기
%CPU : CPU 사용 시간 퍼센트
%MEM : 메모리 사용 퍼센트
TIME : 프로세스가 시작하여 사용한 총 CPU 시간 
COMMAND : 프로세스를 실행한 명령어 라인
6) top 실행 중의 명령어 옵션
SPACE : 화면을 갱신한다.
h, ? : 도움말을 출력한다.
k : kill명령을 내린다. PID값을 입력하면 종료신호를 보낸다.
i : Zombi, idle 프로세스의 출력을 on/off한다.
n 또는 # : 출력한 프로세스의 수를 지정한다.
q : top을 종료
r : Nice 값을 변경
s : 화면을 갱신하는 시간을 변경
F,f : 보여줄 항목을 추가하거나 삭제
O,o : 보여줄 항목의 순서를 바꿈
l : top의 맨 윗줄(uptime)을 on/off한다.
m : 메모리의 관련된 항목을 on/off한다.
t : 프로세스와 CPU항목을 on/off한다.
c : Command line의 옵션을 on/off한다.
M : 프로세스의 RSS값을 정렬한다.
P : %CPU 값으로 정렬(기본값)
T : Time값으로 정렬
W : 바꾼 설정을 저장

(6) jobs

1) 설명 : 백그라운드로 실행중인 프로세스나 현재중지된 프로세스의 목록을 출력해주는 명령어이다. 


2) 사용법
jobs [option]


3) option
-l : 프로세스번호를 추가해서 보여준다.


4) 사용예
ㄱ. [posein@www posein]$ jobs
[1]- Running find / -name '*.txt' 2>/dev/null >list.txt &
[2]+ Stopped vim abc.txt
=> +는 현재 실행중인 프로세스를 나타내고 -기호는 이전에 실행되었던 프로세스를 의미한다.
ㄴ. [posein@www posein]$ jobs -l
[1]- 27832 Running find / -name '*.txt' 2>/dev/null >list.txt &
[2]+ 27833 Stopped (tty output) vim abc.txt
=> 프로세스번호도 같이 보여준다. 위 결과는 find 라는 작업이 먼저 수행되었고 그 다음
vi작업이 실행되었다. 현재 수행중인 작업은 vi 이다. 즉 이 경우에 fg라고 명령내리면
작업번호 2가 수행된다.

(7) fg

1) 설명 : 백그라운드 프로세스를 포그라운드 프로세스로 전환하는 명령이다. 


2) 사용법
fg [%작업번호]


3) 사용예
ㄱ. [posein@www posein]$ fg
=> 백그라운드 작업을 포그라운드작업으로 전환한다. 만약 백그라운드작업이 여러개가 
있을 경우 별도의 작업번호를 부여하지 않으면 현재 수행중인(+기호가 붙은) 작업을 
전환한다.
ㄴ. [posein@www posein]$ fg %2
=> 작업번호 2번인 작업을 포그라운드작업으로 전환한다.


4) 참고 : 포그라운드로 실행중인 작업을 끝내려면 ctrl+c키를 눌러 작업을 종료시킨다.

(8) bg

1) 설명 : 포그라운드프로세스를 백그라운드 작업으로 전환하는 명령이다. 프로세스를 실행한 후
[CTRL]+[Z]키를 눌러 작업을 잠시 중지시킨 후에 bg명령어를 이용하여 작업을 백그라운
드로 보낼 수 있다.


2) 사용법
bg [%작업번호]


3) 사용예
[posein@www posein]$ find / -name '*.txt' 2>/dev/null > list.txt // 포그라운드
// [CTRL]+[Z]키를 눌러 대기시킨다.
[1]+ Stopped find / -name '*.txt' 2>/dev/null >list.txt 

[posein@www posein]$ bg
[1]+ find / -name '*.txt' 2>/dev/null >list.txt &
=> 백그라운드로 전환된다.

(참고) 프로세스 우선순위
멀티태스킹(Multi-Tasking)이란 한 시스템에서 여러 개의 프로세스가 작동되는 것을 말한다. 
리눅스에서 이러한 작업은 프로세스 스케줄러가 정해진 시간만큼만 CPU를 사용할 수 있도록 프로
세스를 교체시키기 때문이다. 프로세스에는 일정한 순서를 나타내는 우선순위가 있다. 이 우선순위
를 나타내는 것이 priority와 nice값이다. 이 값은 ps -l로 확인할 수 있다. PRI는 프로세스의 
실제 우선순위로 리눅스가 계산하여 부여한다. 이 PRI를 부여할 때 NI값이 고려된다. NI는 PRI값에
영향을 주기 위해 프로세스 소유자나 슈퍼유저가 설정한 번호로 nice명령을 이용하여 그 값을 설정
할 수 있다.

(9) nice

1) 설명 : 프로세스의 우선순위를 변경하는 명령으로 NI값을 설정할 수 있다. NI값은 -20 ~ 19
까지 있는데 값이 작을 수록 우선순위가 높다. 일반 사용자는 NI값을 증가시킬 수밖에
없고 루트권한자는 값을 감소시켜 우선순위를 높일 수 있다. 기본값은 0이다.


2) 사용법
nice -값 프로세스명


3) 사용예
[posein@www posein]$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
100 S 501 20843 20842 0 76 0 - 566 wait4 pts/2 00:00:00 bash
000 T 501 20893 20843 0 69 0 - 685 do_sig pts/2 00:00:00 vi
000 R 501 20904 20843 0 78 0 - 752 - pts/2 00:00:00 ps
[posein@www posein]$ nice -10 bash
[posein@www posein]$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
100 S 501 20843 20842 0 73 0 - 566 wait4 pts/2 00:00:00 bash
000 T 501 20893 20843 0 69 0 - 685 do_sig pts/2 00:00:00 vi
000 S 501 20906 20843 0 77 10 - 564 wait4 pts/2 00:00:00 bash
000 R 501 20923 20906 0 79 10 - 753 - pts/2 00:00:00 ps
=> bash의 NI값을 10으로 설정한다. NI값을 변경하면 bash의 자식프로세스인 
NI값도 바뀐다.
[root@www /root]# nice --10 bash
=> bash의 NI값을 -10으로 설정한다.
(참고) bash와 NI값
bash는 로그할 때의 부여받는 환경에 가까워서 NI값을 변경하면 실제적으로 우선순위의 변동보다
새로운 bash를 부여받는 쪽에 가깝다. 

(10) renice

1) 설명 : 실행중인 프로세스의 우선순위를 변경할 때 사용하는 명령으로 오직 그 프로세스의 
소유자와 루트권한자만이 명령을 내릴 수 있다. 이 명령도 NI값을 부여함으로서 우선
순위가 변경되며 루트권한자만이 프로세스의 우선순위를 높일 수 있다.


2) 사용법
renice [options] 값 PID


3) options
-g : 그룹 ID 지정
-u : 사용자 ID 지정
-p : 프로세스 ID 지정(초기값)


4) 사용예 
ㄱ. [posein@www posein]$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
100 S 501 20843 20842 0 69 0 - 566 wait4 pts/2 00:00:00 bash
000 T 501 20893 20843 0 69 0 - 685 do_sig pts/2 00:00:00 vi
000 S 501 20906 20843 0 79 10 - 564 wait4 pts/2 00:00:00 bash
000 R 501 20937 20906 0 77 10 - 752 - pts/2 00:00:00 ps
[posein@www posein]$ renice 15 20906
20906: old priority 10, new priority 15
[posein@www posein]$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
100 S 501 20843 20842 0 69 0 - 566 wait4 pts/2 00:00:00 bash
000 T 501 20893 20843 0 69 0 - 685 do_sig pts/2 00:00:00 vi
000 S 501 20906 20843 0 77 15 - 564 wait4 pts/2 00:00:00 bash
000 R 501 20939 20906 0 79 15 - 752 - pts/2 00:00:00 ps
=> 20906작업의 NI값을 15로 바뀌면서, PRI는 적당한 값으로 자동 설정된다.
ㄴ. [root@www root]# renice 1 987 -u daemon root -p 32
=> 프로세스 ID가 987, 32 인 것과 사용자가 daemon, root인 모든 프로세스의 우선권값을
1로 바꾼다.

(11) nohup

1) 설명: 이 명령은 사용자가 로그아웃하거나 터미널창을 닫아도 해당 프로세스를 백그라운드로 
작업될 수 있도록 해주는 명령이다.


2) 사용법
nohup 명령


3) 사용예 
nohup tar cvf source.tar /opt/src &


4) 참고
만약 표준출력이 화면이었는데 사용자가 로그아웃하게 되면 표준출력과 표준에러를 'nohup.out'
이라는 파일에 저장한다. 현재 작업디렉토리에 쓰기작업이 불가능한 경우에는 ~/nohup.out를
생성하고 그것도 불가능하게 되면 실행이 되지 않는다. 또한 우선권을 5 만큼 증가시켜 수행하고
실행한 명령을 자동으로 백그라운드로 보내지 않으므로 직접 명령행 뒤에 '&'를 붙여 백그라운드
로 보내주어야 한다






---------------------------------
출처 - ???(어디였는지 까묵었습니다.^^;;)

블로그 보관함