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 mysqld
=> 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 만큼 증가시켜 수행하고
실행한 명령을 자동으로 백그라운드로 보내지 않으므로 직접 명령행 뒤에 '&'를 붙여 백그라운드
로 보내주어야 한다
---------------------------------
출처 - ???(어디였는지 까묵었습니다.^^;;)
댓글 없음:
댓글 쓰기