개발자 끄적끄적

프로세스 관리 본문

Linux

프로세스 관리

햏치 2023. 3. 3. 23:12

<프로세스 관리>

<프로세스>
- 프로그램(Program)이 실행되어서 프로그램이 메모리에 올라가는 것
- 리눅스가 부팅될 때 실행된다면 그것은 init 프로세스가 기동시키는 것
- 데몬(Daemon) 프로세스란, 리눅스 서버가 부팅될 때 백그라운드에서
  실행되고 있으며 클라이언트의 요구에 서비시를 수행하는 프로그램


<데몬 프로세스>
1. standalone 방식 
- 백그라운드에서 항상 실행되고 클라이언트에게 서비스를 요청하면
  즉시 처리를 수행

2. inetd 방식
- 메모리에 상주되지 않고 sleep 상태로 있다가 클라이언트 요청 시에 
  Wake up되어 서비스를 수행




<init 프로세스>
- 리눅스 상에서 동작하는 모든 프로세스
- /etc/inittab 파일을 읽고 해당 파일에 설정된 프로세스를 실행



<init 프로세스 기능>
- 부팅 시 init 프로세스 생성 후 init 프로세스가 필요한 다른 프로세스를
  순차적으로 생성한다
- 부팅 완료 후 백그라운드 프로세스로 동작하며, 다른 프로세스를 감시
- 감시하는 프로세스가 종료되어 좀비 프로세스가 되었을 경우
  해당 프로세스의 리고고를 해제하여 반환
- 리눅스 시스템이 기동되면 제일 먼저 실행되는 프로세스로
  /etc/inittab 파일을 읽어 들여서 Run Level을 실행한다



<Run Level>
- 리눅스 시스템이 떻게 부팅될 것인가를 결정
- 사용자 혼자 사용할 것인지, 다중 사용자를 허락할 것인지, 
  파일 시스템 공유를 허락할 것인지 등을 결정해서 실행



<Run Level>
0단계
- PROM 감사 단계

1단계
- 관리상태의 단계로 사용자 로그인의 접근이 불가능한 단일 사용자 단계로
  여러 개의 파일시스템이 로드(Load)되고 있다
- 암호를 변경할 때 사용

2단계
- 공유된 자원을 가지 않은 다중 사용자 단계

3단계
- 기본 실행단계로 공유 자원을 가진 다중 사용자 단계, 텍스트 유지모드

4단계
- 현재 사용되지 않음

5단계 
- Run level 3으로 기동 후에 그래픽모드(X-Window) 실행

6단계
- 재부팅 단계로 실행단계의 3의 상태로 재부팅




<리눅스 프로세스 생성>
1. fork 
- 프로세스를 생성하는 것으로 자식 프로세스는 별도의 메모리 공간인 
  PCB(Process Control Block)가 할당됨

2. exec
- 원래의 프로세스를 대처하여 별도의 공간을 할당하지 않음





<프로세스 모니터링(Process Monitoring)>

1. ps(Process Monitoring)
- 프로세스 상태 정보를 확인


<ps 옵션>
-l(list) : 세부적 정보를 출력
-u(user) : 프로세스의 사용자 이름과 시작 시간 출력
-j(job) : 작업 중심형태 출력
-s(signal) : 시그널 중심형태 출력
-v(virtual memory) : 가상 메모리 중심형태 출력
-m(memory) : 메모리 정보를 출력
-a(another) : 다른 사용자들의 프로세스를 출력
-x(execute) : 로그인 상태에 있는 동안 완료되지 않은 프로세스를 출력
-S : Child CPU 시간 및 메모리 페이지 결함 정보를 출력
-c(common) : task_structure로부터 명령 이름을 출력
-e(environment) : 환경정보
-w : 긴 형태로 출력
-h : 헤더를 출력하지 않음
-r(run) : 현재 실행 중인 프로세스 출력




<ps 출력 필드>
- USER : 사용자 계정
- PID : 프로세스 ID
- PPID(PRIOR PID) : 부모 프로세스 ID
- RSS : 프로세스에 의해서 사용된 실제 메모리 용량
- SZ(STACK SIZE) : 프로세스 자료와 스택 크기
- TIME : 현재까지 사용된 CPU 시간
- TTY : 프로세스 제어 터미널
- %CPU : 프로세스가 사용한 CPU
- %MEM : 프로세스가 사용한 메모리
- START : 프로세스 시작 시간
- STAT(STATE) : 프로세스 상태
- COMMAND : 명령어 이름




2. pstree(process tree)
- 실행 중인 프로세스 상태를 트리형태로 출력
- 프로세스의 부모 자식 관계를 보여주는 명령어




<pstree 옵션>
-a : 명령 라인 수를 출력
-c : 동일한 하위 트티를 축약하지 않음
-h(highlight) : 현재 작동 중인 부모 프로세스와 자식 프로세스를 하이라이트
-n : PID 순서를 정렬
-p : PID를 트리구조에서 출력 + process 명






3. top
- 시스템 자원을 모니터링할 수 있는 프로세스
- CPU 사용률, 메모리 사용률, 실행 중인 프로세스 리스트 등을 확인



<top 옵션>
top -d[sec] : 설정한 sec(초) 단위로 Refresh
top -c : 명령 뒤에 인자 값 표시
m : 메모리 정보를 키거나 끌 수 있다



<top 필드>
PID : 프로세스 아이디
USER : 사용자 ID
PR : 작업순위
NI : 작업 우선 순위
VIRT : 가상 메모리 총 크기
RES : 실제 사용중인 물리 메모리 총 크기
SHR : 공유 메모리 총 크기
S : 프로세스 상태
%CPU : CPU 사용량
%MEM : 메모리 사용량
TIME+ : 프로세스가 CPU를 점유한 누적시간
COMMAND : 명령어 정보




<top 실행 시 명령어>
shift+t(time) : 실행 시간이 오래된 순으로 정렬
shift+m(memory) : 메모리 사용량으로 정렬
shift+p(cpu) : CPU 사용량으로 정렬
shift+b : uptime과 기본 정보 값 블록 선택
k(kill) : 프로세스 종료
l : 명령인자 표시
u(user) : 입력 사용자의 프로세스만 출력
f : 표시될 프로세스 항목 설정
o(order) : 프로세스 관련 항목 표시 순서 변경
r : Nice 값 변경
m(memory) : 메모리 항목 On/Off
t : 프로세스와 CPU 항목 On/Off
c(command) : 명령 옵션 On/Off
i(ignore) : IDLE와 좀비(Zombie) 프로세스 무시
space : Refresh
q(quit) : 종료





<포어그라운드와 백그라운드 프로세스>
리눅스 프로세스

1. 포어 그라운드(Foreground)
- 별다른 행위를 하지 않고 프로세스를 실행

2. 백그라운드(Background)
- 프로세스 명 뒤에 &를 붙여서 실행


<fg 명령>
- 백그라운드에서 실행되는 프로세스를 포어그라운드 프로세스로 전환

<jobs 명령>
- 백그라운드에서 실행되는 프로세스 리스트를 확인



<fg(Foreground Process) 명령어>
- 백그라운드 프로세스를 포어그라운드 프로세스로 전환
- 백그라운드 프로세스가 여러 개일 경우 작업 번호를 부여하여
  포어 그라운드로 전환
- fg%작업번호



<bg(Background Process) 명령어>
- 포어그라운드 프로세스를 백그라운드 프로세스로 전환
- 포어그라운드 프로세스에서 CTRL+Z 키를 실행하면, 작업을 중지
  bg명령으로 작업을 백그라운드로 전환
- 프로세스를 백그라운드 프로세스로 실행하기 위해서는 명령어 뒤에
  &를 붙인다



<nohup>
- 프로세스를 백그라운드에서 데몬으로 실행
- 터미날 접속을 종료해도 프로세스는 실행된다
- 실행방법 : nohup[shell 파일]&




<프로세스 우선순위>
- CPU에 어떤 프로세스가 먼저 진입하여 실행될 것인지를 결정
- 우선순위가 높으면, 프로세스가 빠르게 처리
- 프로세스 우선순위는 renice명령어를 사용



<renice>
- 특정 프로세스가 실행될 때 우선순위를 지정하여 실행속도를 높인다
+number : number 수 만큼 우선순위를 낮춘다
-number : number 수 만큼 우선순위를 높인다
- 높은 우선순위로 변경하려면 root권한이 필요하다
  - 일반 사용자 : 0~20 값 지정
  - root 계정 : -20~19




<시그널>
- 프로세스 혹은 시스템에 신호를 보내는 것으로 다른 의미로
  이벤트(Event)라고 할 수 있다
- 프로세스에 시그널을 보내서 어떤 명령이 실행될 수 있게 할 수도 있고
  프로세스를 강제로 종료시킬 수도 있다
-  프로세스에게 시그널을 보내는 명령 : kill



<kill>
- 프로세스에게 신호(Signal)를 전송
  - -9 : 프로세스 종료 
  - HUP : 프로세스 재시작 명령
  - TERM : 프로세스를 종료
  - SIGKILL : 무조건 프로세스를 종료



<자주 사용하는 시그널>
SIGHUP : 로그아웃하거나 접속을 끊을 때 발생하는 시그널
SIGINT : 현재 작동 중인 프로그램의 동작을 멈출 때 사용
SIGQUIT : 사용자가 터미널에서 종료키를 누를 때 커널에 의해 
  보내지는데 일반적인 값은 CTRL+C
SIGKILL : 무조건 해당 실행중인 프로그램을 중단
SIGSEGV : 메모리 액세스가 잘못되었을 때 발생
SIGTERM : 실행 중인 프로그램에 정의되어 있는 정상적인 종료 방법으로
  프로그램을 끝내개 함




<리눅스 시그널 번호>
SIGHUP : 1
SIGINT : 2
SIGQUIT : 3
SIGKILL : 9
SIGSEVG : 11
SIGTERM : 15
SIGSTOP : 19
SIGTSTP : 20
SIGCONT : 18




<ps 명령어와 kill>
1. ps(process)
ps -ef : 프로세스 확인 명령
pgrep -If sendmail : 프로세스 실행 확인 명령

2. kill
kill PID, killall PID : 프로세스 정지 명령
kill -15 PID : default signal 제거
kill -9 PID : 프로세스 강제 제거
pkill sendmail : 프로세스 정지 명령
*sendmail : 메일을 발송하는 프로세스


<killall 명령>
- PID가 아니라 프로세스 이름으로 프로세스를 종료하는 명령어
-l(list) 옵션 : 알려진 모든 시그널명을 목록으로 표시
-V(Version) : 버전 정보를 표시
-v : 시그널이 전송된 결과를 출력

'Linux' 카테고리의 다른 글

프로토콜  (0) 2023.03.03
패키지 관리  (0) 2023.03.03
클래스_서브넷마스크  (0) 2023.03.03