linux class(new) 2 페이지

본문 바로가기
사이트 내 전체검색


회원로그인

linux class(new)

process 관리

페이지 정보

작성자 admin 작성일16-01-18 16:39 조회2,289회 댓글0건

본문

process는 흔히 실행중인 프로그램을 뜻한다.
file과는 다르다. file은 디스크 상에 존재하며 수동적이다.
process는 메모리에 있거나 cpu가 실행중일수 있다.
예를 들면,디스크의 특정 디렉토리에 있는 ls 명령을 실행하면 ls 명령이 메모리에 올라가고
cpu 자원을 할당 받아 실행된다. 이것을 process 라고 하며 실행이 끝나면 메모리에서 완전히 제거된다.
프로세스를 잘못관리하면 시스템 성능이 떨어질 수 있으며 보안상 시스템이 취약해질 수도 있다.
------------------------------------------------------------------------------------------------
프로세스 상태보기
*. 실습을 위해서 리눅스 서버로 일반계정으로 접속해서
bash shell 한개와 sleep 프로세스를 세개 실행한다
bash --> sleep 1000 & ---> sleep 2000 & ---> sleep 3000 & ; 이것을 차례대로 실행
1. ps - process 상태 출력
[lee ~]$ ps
PID TTY TIME CMD
4732 pts/1 00:00:00 bash
5000 pts/1 00:00:00 bash
5017 pts/1 00:00:00 sleep
5018 pts/1 00:00:00 sleep
5019 pts/1 00:00:00 sleep
5020 pts/1 00:00:00 ps
[lee ~]$

ps 명령을 아무런 옵션 없이 사용하면 출력되는 내용은 현재 터미널에서(여기서는 pts/1) 현재 사용자 권한
(여기서는 lee)으로 실행(메모리에 있거나 cpu 자원을 할당받은)중인 프로세스만 출력된다. 아무런 옵션 없이
사용하면 가장 단순한 형태로 출력해준다.

위의 ps 명령의 각 항목의 의미는 아래와 같다.
PID : 커널이 식별하는 프로세스 식별자
프로세스가 생성되는 순서대로 번호가 할당되며 1번은 init 이다.
TTY : 프로세스가 어떤 터미널에서 실행되었는가 하는 정보
TIME : 프로세스가 cpu를 점유한 누적 시간
CMD : 프로세스 이름


모든 프로세스 목록을 다 보고 싶다면 -e 옵션을 사용하면 된다.
[user1@river /home/user1]$ ps -e
[lee@river ~]$ ps -e
PID TTY TIME CMD
1 ? 00:00:02 init
2 ? 00:00:00 kthreadd
3 ? 00:00:00 migration/0
4 ? 00:00:00 ksoftirqd/0
5 ? 00:00:00 stopper/0
6 ? 00:00:00 watchdog/0
7 ? 00:00:00 migration/1
8 ? 00:00:00 stopper/1
9 ? 00:00:00 ksoftirqd/1
10 ? 00:00:00 watchdog/1
11 ? 00:00:00 migration/2

......... 이하생략...

위에 출력결과중 TTY는 프로세스가 실행된 터미널을 나타내는데 ? 로 표시된 것은 터미널과 관계없는
프로세스를 뜻한다. 예를 들면 부팅할 때 자동으로 실행된 프로세스를 의미한다.
그리고 STAT 는 프로세스 상태를 나타내는 부분으로 여기에서 몇 가지가 있다.
S (sleep) : 프로세스가 cpu 자원을 기다리고 있는 상태
T : 중단된 상태(CPU 자원을 할당 받을 수 없는 상태)
R : Runable 또는 Running 상태
Z : Zombie 상태


주요옵션
-e : 모든 프로세스 출력
-f : 프로세스 소유자 및 부모 프로세스 정보까지 출력
------------------------------------------------------------------------------------------------
2. pidof - process id 를 찾는 명령어
[lee ~]$ pidof sleep
5019 5018 5017
[lee ~]$
------------------------------------------------------------------------------------------------
3. pgrep ; pid 대신에 process 이름이나 프로세스의 다른속성을 사용하여
프로세스 정보 출력


[lee ~]$ pgrep sleep
5017
5018
5019

[lee ~]$ pgrep -fl sleep
5017 sleep 1000
5018 sleep 2000
5019 sleep 3000

[lee ~]$ pgrep -u lee -fl
4731 sshd: lee@pts/1
4732 -bash
5000 bash
5017 sleep 1000
5018 sleep 2000
5019 sleep 3000
[lee ~]$
------------------------------------------------------------------------------------------------
4. pstree ; process 를 tree 구조로 출력
(프로세스도 file system 처럼 계층적 구조로 되어 있다.
부모프로세스가 있고 그 아래에 자식 프로세스가 있는 구조이다. )

new_pstree.jpg
pstree -u 사용자 => 특정 사용자 권한의 프로세스만 tree 구조로 출력할 수 있다.

new_pstree2.jpg
------------------------------------------------------------------------------------------------
5. top ; process 를 실시간 모니터링
top_new.jpg
------------------------------------------------------------------------------------------------
프로세서 제어 명령어 kill
kill 명령은 프로세스에게 특정 signal 을 전달하는 명령어인데 아래에 전달 할 수 있는
모든 signal의 종류를 확인할 수 있다. 그러나 일반적으로 자주 사용되는 것들은 몇 안 된다.
[lee ~]$ 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

... 이하생략.

주요 signal
1) SIGHUP : 프로세스 재실행이다. 죽였다가 다시 실행하는것과 같다.
2) SIGINT : 현재 프로세스 강제종료. ctrl+c 를 사용한다.
9) SIGKILL : 가장 많이 사용되는 시그널로 프로세스 강제 종료이다. 프로세스가 어떤일을 하든 무조건 죽인다.
물론 죽일 수 없는 예외적인 프로세스도 존재한다. 예를 들면 init 프로세스
15) SIGTERM : 프로세스 종료.
이 시그널을 사용하면 프로세스가 종료되지 않을 수도 있다.강제종료가 아니기 때문이다.
20) SIGTSTP : 현재 프로세스 강제 중단. ctrl+z 사용

[lee ~]$ ps
PID TTY TIME CMD
4732 pts/1 00:00:00 bash
5000 pts/1 00:00:00 bash
5018 pts/1 00:00:00 sleep
5019 pts/1 00:00:00 sleep
5107 pts/1 00:00:00 ps

sleep 프로세스는 실행할 때의 인자에 해당하는 시간(초)만큼 메모리를 점유한다.
필요없다고 가정하고 제거해보자.

[lee ~]$ ps
PID TTY TIME CMD
4732 pts/1 00:00:00 bash
5000 pts/1 00:00:00 bash
5018 pts/1 00:00:00 sleep
5019 pts/1 00:00:00 sleep
5108 pts/1 00:00:00 ps
[lee ~]$ kill -SIGKILL 5018
[lee ~]$
[2]- 죽었음 sleep 2000
[lee ~]$ kill -9 5019
[lee ~]$
[3]+ 죽었음 sleep 3000
[lee ~]$

-SIGKILL 대신에 -KILL 또는 -9(signal 번호)라고 해도 같다.
[lee ~]$ sleep 500 &
[1] 5124
[lee ~]$ ps
PID TTY TIME CMD
4732 pts/1 00:00:00 bash
5000 pts/1 00:00:00 bash
5124 pts/1 00:00:00 sleep
5125 pts/1 00:00:00 ps
[lee ~]$

[lee ~]$ kill 5124
[1]+ 종료됨 sleep 500
[lee ~]$
종료 메세지가 다르다. 아무런 signal을 사용하지 않으면 기본적으로 -SIGTERM 시그널이 사용된다.
kill PID = kill -SIGTERM PID = kill -TERM PID = kill -15 PID => 이 세 개는 다 같은 의미이다.
-SIGTERM 은 -SIGKILL 과 달리 프로세스를 안전하게 정상적으로 종료시킨다.

다른 signal 도 확인해보자.
[lee ~]$

HUP ; 서버 프로세스를 재실행 하는경우에 많이 사용한다.
(*. 아래 명령은 root 계정으로 해야 한다.)
[root ~]:# pgrep -fl crond
1836 crond <===작업예약 스케쥴 서버
[root ~]:# kill -HUP 1836
-------------------------------------------------------------------------------
foreground/background 프로세스
foreground 프로세스에게 터미널 제어권이 있다. foreground 프로세스가 실행중인동안
터미널에서 명령을 바로 실행하지 못한다.

[lee ~]$ sleep 1000
cal
pwd

=> sleep 프로세스가 foreground 상태로 실행중이다.
그 아래에 입력된 cal 와 pwd 는 대기중이며 sleep 끝나야 실행이 된다.

[lee ~]$ sleep 1000
cal
pwd
^C
[lee ~]$
[lee ~]$ sleep 1000 &
[1] 5132
[lee ~]$ cal
1월 2016
일 월 화 수 목 금 토
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
31
[lee ~]$ pwd
/home/lee
[lee ~]$
=> 이제 터미널 제어권이 sleep 에게 있지 않으므로 명령을 계속 입력하는 것이 가능하다.
*.background 프로세스는 jobs 명령어로 관리할 수 있다.
[lee ~]$ ps
PID TTY TIME CMD
4732 pts/1 00:00:00 bash
5000 pts/1 00:00:00 bash
5132 pts/1 00:00:00 sleep
5142 pts/1 00:00:00 ps

[lee ~]$ sleep 2000 &
[2] 5143
[lee ~]$ sleep 3000 &
[3] 5144
[lee ~]$

[lee ~]$ jobs <=== 중단 또는 background 상태로 실행중인 프로세스만 출력
[1] Running sleep 1000 &
[2]- Running sleep 2000 &
[3]+ Running sleep 3000 &
[lee ~]$
출력결과중 숫자는 프로세스 제어에 사용되는 job 번호 이며 +,- 기호는 가장 나중에 실행된 것,
그리고 두 번째로 나중에 실행된 프로세스를 뜻한다.
[lee ~]$ kill %1
[1] 종료됨 sleep 1000
[lee ~]$
[lee ~]$ jobs
[2]- Running sleep 2000 &
[3]+ Running sleep 3000 &
[lee ~]$
프로세스 id 대신 job 번호로도 프로세스를 제어할 수 있다.
중단 또는 백그라운드로 실행중인 프로세스를 foreground 로 전환하고자 하는 경우에는
fg %job번호를 사용하면 된다.
[lee ~]$ fg
sleep 3000
[lee ~]$ fg
sleep 3000
^Z
[3]+ Stopped sleep 3000
[lee ~]$ jobs
[2]- Running sleep 2000 &
[3]+ Stopped sleep 3000
[lee ~]$

[lee ~]$ bg %3
[3]+ sleep 3000 &
[lee ~]$ jobs
[2]- Running sleep 2000 &
[3]+ Running sleep 3000 &
[lee ~]$
그리고 foreground 상태의 프로세스를 background 로 전환하고자 할 경우에는 먼저 프로세스를 ctrl+z 로
강제 중단한 후 bg 명령을 사용하면 된다.
-----------------------------------------------------------------------------------------------
*. 기타 프로세스 제어 명령어 - killall, pkill
[lee ~]$ kill -9 sleep ; kill 은 process 이름을 사용할 수 없다.
bash: kill: sleep: arguments must be process or job IDs
[lee ~]$ killall -9 sleep ; killall은 process 이름을 사용한다.
[2]- 죽었음 sleep 2000
[3]+ 죽었음 sleep 3000
[lee ~]$
*. killall 대신에 pkill 을 사용해도 된다.

댓글목록

등록된 댓글이 없습니다.


접속자집계

오늘
100
어제
75
최대
611
전체
448,150
개인정보취급방침 서비스이용약관 twoseven.kr All rights reserved.
상단으로