[리눅스마스터 2급 2차] 1과목 – 3. 프로세스 관리

[1과목: 리눅스 운영 및 관리]

1. 파일 시스템 관련 명령어

2. 쉘(Shell)


3. 프로세스 관리

3. 1. 개념 및 유형

3. 1. 1. 프로세스의 개념

  • CPU와 메모리를 할당 받아 실행시키는 프로그램
  • 프로세스마다 고유의 프로세스ID(PID)를 할당.
    cf) 가장 먼저 실행되는 프로세스는 init이며, PID는 1
    cf) CentOS 7부터는 기존 init 프로세스에서 systemd를 사용하며, PID는 1


3. 1. 2. 프로세스의 유형

: 프로세스는 실행 형태에 따라 포그라운드(Foreground)와 백그라운드(Background)로 나뉨

포그라운드(Foreground)

  • 사용자의 명령에 으해 실행되고 터미널에서 직접 제어하는 프로세스
  • 명령 입력 후 수행 종료까지 다른 작업을 수행할 수 없으며, 작업 완료 후 화면에서 실행된 것이 보이는 프로세스
  • ex) 응용 프로그램, 명령어 등

백그라운드(Background)

  • 사용자의 직접적인 제어 없이 시스템에서 자동으로 실행되는 프로세스
  • 실행은 되지만 화면에 보이지 않고 실행되는 프로세스
  • ex) 시스템 프로그램, 데몬 프로세스


3. 1. 3. 프로세스의 실행 ★

: 한 프로세스가 다른 프로세스를 실행하기 위해 사용하는 시스템 호출 함수로는 fork()와 exec()가 있다

fork() 함수★★★

  • 새로운 프로세스를 만들 때 기존 프로세스를 복제하는 방식이며, 똑같은 코드를 가짐
  • 기존 프로세스는 부모 프로세스, 새로운 프로세스는 자식 프로세스라 부름
  • 새로운 프로세스를 위한 메모리를 추가로 할당

exec() 함수 ★★★

  • 현재 실행되고 있는 프로세스는 종료되고 exec()함수에 의해 호출된 프로세스만 실행
  • 현재 실행되고 있는 프로세스에서 다른 프로그램을 실행하기 위한 시스템 호출 함수
  • 호출한 프로세스의 메모리에 새로운 프로세스의 코드를 덮어 씌우기 때문에, 새로운 프로세스를 위한 메모리는 미할당


3. 1. 4. 데몬(Daemon) ★

  • Linux시스템이 부팅 시 자동으로 실행되는 백그라운드 프로세스
  • 주기적이고 지속적인 서비스 요청을 처리하기 위해 계속 실행되는 프로세스
  • 메모리에 상주 하면서, 사용자의 특정 요청이 오면 즉시 실행하는 서버 역할
  • 이름 뒤에 데몬을 뜻하는 d가 존재
  • ex) inetd, httpd, nfsd, sshd, lpd, systemd, ftpd, syslogd 등
  • 데몬 프로세스가 실행되는 방식은 Stand aloneinetd(Xinetd)

Stanad alone ★★★

  • 데몬이 독자적으로 구동되는 방식으로, 혼자서 요청을 받아 처리
  • 메모리에 상주하며 항상 구동되기 때문에 응답이 빨라, 요청이 빈번한 프로세스에서 많이 사용
  • ex) sendmail, apache, mysqld, httpd등

inetd(Xinetd) ★★★

  • 다른 데몬들의 상위에 존재하며, 슈퍼데몬(Super Daemon)이라고도 불림
  • inetd자체는 Stand alone방식으로 동작하지만, 요청이 왔을 때 자신(inetd)에게 종속된 하위 데몬을 실행시킴
  • 요청이 들어오지 않을 때는 휴먼상태가 되어 메모리 관리가 효율적
  • Linux 2.4버전부터 inetd 대신 Xinetd가 역할 수행
  • ex) telent, finger, ftp, shell 등


3. 1. 5. 시그널(Signal) ★

  • 운영체제가 프로세스에게 이벤트 발생을 전달해주는 소프트웨어 인터럽트
  • 프로세스가 시그널을 받았을 때 처리 방식
    • SIG_IGN(SIG_PF)1: 운영체제에 의해 시그널이 무시됨
    • SIG_ERR(SIG_PF)-1: 운영체제가 프로그램을 강제 종료
    • SIG_DFL(SIG_PF)0: 지정한 시그널 처리 루틴 실행
    • SIG_HOLD(SIG_PF)2: 시그널이 블로킹됨

#kill ★★★
: 시그널을 확인하거나, 특정 프로세스(PID)에 시그널을 호출

#kill [옵션] [PID]

[옵션]
-l: 시그널 종류 확인
-n [시그널 번호] : 시그널 번호를 이용하여 PID에 시그널 호출
-s [시그널]: 시그널을 이용하여 PID에 시그널 호출

시그널 번호시그널발생 조건기본 동작
1SIGHUP터미널과 연결이 끊어졌을 때종료 후 재시작
2SIGINT현재 프로그램의 동작을 멈출 때
[Ctrl] + [C] 입력 시
종료
3SIGQUIT사용자가 터미널에서 종료키를 누를 때
[Ctrl] + [\] 입력 시
코어 덤프
6SIGABRTabort(비정상 종료)함수에 의해 발생코어 덤프
9SIGKILL프로세스 강제 종료 시종료
13SIGPIPE종료된 소켓에 쓰기를 시도할 때코어 덤프
14SIGALRM알람 타이머 만료 시코어 덤프
15SIGTERM정상 종료 시종료
17SIGCHLD자식 프로세스가 종료 시무시
18SIGCONT중지된 프로세스 실행 시무시
19SIGSTOPSIGCOUNT 시그널을 받을 때까지종료
20SIGTSTP[Ctrl] + [Z] 입력 시프로세스 대기로 전환
kill -15 1109         # 프로세스 PID 1109 종료
kill -SIGTERM 1109    # SIGTERM(15):종료
kill -s SIGTERM 1109  #

#killall ★★★
: 여러 프로세스를 한 번에 종료

#killall [옵션] [프로세스명]

[옵션]
-l: 시그널 목록 확인
-g: 그룹을 지정하여 프로세스 종료
-i: 프로세스 종료 전 확인 메시지 표시
-v: 시그널이 전송된 결과를 출력

service httpd stop
killall httpd
killall -v -9 httpd  # 9(kill)
killall -kill httpd

cf) ‘kill’은 PID로 시그널을 호출하지만 ‘killall’은 프로세스명으로 시그널을 호출


3. 2. 프로세스 Utility

3. 2. 1. 프로세스 관련 명령어 ★

#ps ★★★
:현재 계정 및 현재 터미널에서 실행 중인 프로세스의 상태 확인

#ps [옵션]

[옵션]
-f: UNIX 스타일의 FullFormat으로 표기(UID, PPID 등)
-l: 프로세스의 자세한 정보 확인(UID, PPID, F, S, NI 등)
-u: -l이외 프로세스가 차지하는 CPU, 메모리 등 정보 확인(USER, %CPU, %MEM 등)
-x: 접속된 터미널 뿐만 아니라 현재 사용자가 사용하고 있는 모든 프로세스 확인
-a: 현재 사용자 이외 다른 사용자를 포함하여 현재 실행중인 모든 프로세스 확인
-e: 실행 된 모든 프로세스 정보 확인
-A: -e에서 커널 프로세스를 포함하여 확인
cf) 자주사용하는 조합

ps -aux              # 현재 실행중인 모든 프로세스의 CPU, 메모리 등 정보 확인
ps -ax | grep httpd  # 웹서버(httpd)프로세스의 가동 유무 확인
ps -ef | hrep sshd   # 실행 된 모든 프로세스 중 sshd 데몬 확인
상태설명
PID프로세스ID, 프로세스 식별 번호
TTY프로세스와 연결된 터미널 번호
TIME총 CPU 사용 시간
CMD실행 명령

#ps -l

상태설명
F프로세스 플래그, 8진수 값의 합을 나타냄
01: 주기억 장치 내에 존재
02: 시스템 프로세스
04: 주기억 장치 내에서 잠김(Locked)
10: 스왑(Swap)되고 있음
20: 다른 프로세스에 의해 추적되고 있음
S프로세스 상태
R: Running
T: Terminated
S: Sleeping
Z: Stopped
W: Waiting
I: Intermediated
UID프로세스 사용자ID
PPID부모 프로세스의 PID
C짧은 시간 동안의 CPU 사용률
PRI실행 우선순위. 짧을 수록 우선순위가 높음
NINICE 우선순위를 계산할 때 사용되는 Nice 값
ADDR프로세스의 주기억장치 내의 주소
SZ프로세스 크기. 블록 단위
WCHAN프로세스가 대기나 수면상태에서 기다리는 사건
기다리는 사건이 실행될 주기억장치 내의 주소를 가리킴
실행중인 프로세스는 공백

#ps -aux

상태설명
USER프로세스 계정명
%CPUCPU 사용 비율의 추정치
%MEM메모리 사용 비율의 추정치
VSZ페이지 단위의 가상 메모리 사용량
RSS실제 사용된 메모리량
STAT현재 프로세스 상태
P: 수행 가능/수행중
R: 현재 실행 상태
S: 잠든 상태, 20초 이상 된 상태
D: I/O작업이 끝나기를 기다리면서 정지된 상태
T: 일시 정지 상태
Z: 좀비 프로세스.
작업 종료 후 부모 프로세스로부터 회수 되지 않아 메모리에 적재되어 있음
START프로세스 시작 시간
COMMAND실행 명령

#pstree
: 실행 중인 프로세스들을 트리 구조로 확인

#pstree [옵션]

[옵션]
-p: PID 표시
-n: PID로 정렬하여 표시
-a: 명령행 인자를 포함하여 표시
-h: 현재 프로세스와 해당 프로세스의 부모 프로세스를 음영으로 강조

#jobs
: 작업 중지 상태, 백그라운드 상태, 변경되었지만 보고되지 않은 상태 확인

#jobs [옵션] [작업번호]

[옵션]
-l: 프로세스 그룹ID 표시
-n: 프로세스 그룹 중 대표 프로세스 ID표시
-p: PID를 한 행씩 표시

#bg
: 현재 실행 중인 프로세스를 백그라운드 작업으로 전환

#bg [작업번호]

#fg
현재 백그라운드로 실행 중인 명령어를 포그라운드로 전환

#fg [작업번호]

#nice ★★★
: 프로세스 사이의 우선순위를 확인하고 NI값을 조정(증가 or 감소)하여 우선순위를 변경

#nice (-n) [NI 조정수치] [프로세스명]
  • NI 조정수치 만큼 증가(-), 감소(–)
  • NI의 기본값은 0이며, 지정 가능 범위는 -20 ~ 19
  • nice 명령어의 값을 지정하지 않으면 조정 수치는 ‘-10′(10증가)으로 지정
  • NI값은 낮을수록(-20에 가까울 수록) 우선순위 높음
  • 일반 사용자는 nice값의 증가만 가능, root는 nice값 감소 가능
  • -n 옵션은 생략 가능

#renice ★★★
: 이미 실행 중인 프로세스의 우선순위 변경

#renice [옵션] [NI값] [PID]

[옵션]
-p [PID]: 프로세스 ID(PID)지정 *default
-g [프로세스 GID]: 프로세스 GID 지정
-u [User | UID]: 사용자명 or UID지정

  • 프로세스 소유자와 root만 명령 가능
  • nice와 달리 NI값을 지정

#top ★★★
: 시스템의 운영 상태를 실시간으로 모니터링. 모니터링 화면으로 전환됨

#top [옵션]

[옵션]
-d [시간]: 실시간 화면 출력 시간 조정(sec단위)
-p [PID]: 모니터링 할 PID 지정

[내부 명령]
m: 메모리 관련 항목 on/off
t: cpu항목 on/off
r [PID] [NI값 조정 수치]: 해당 PID의 NI값 조정
k [PID}: 지정 PID 종료
q: [Ctrlp] + [c]. 실행 종료

#nohup
: 사용자가 로그아웃하거나 세션이 끊겨도 프로세스를 중단하지 않고 작업 수행

  • 백그라운드로 실행할 경우 뒤에 ‘&’를 명시하는 조합으로 주로 사용
  • 용량이 큰 데이터 압축 해제와 같이 실행 시간이 오래걸리는 경우 사용
  • 실행 중인 프로세스의 표준 출력 결과는 ‘nohup.out’을 생성하여 기록
  • 종료 시 ‘ps -ef’로 PID확인 후 ‘kill -9 [PID]’로 종료
nohup tar cvf test.tar * &
  # 현재 디렉터리의 모든 파일을 test.tar로 압축하는 작업을 백그라운드로 중단되지 않고 수행

cron / crontab ★★★★★
: 주기적으로 반복되는 일을 자동적으로 수행할 때 사용

  • 스케줄링 데몬(서비스)은 ‘crond’이며, 파일은 ‘/etc/crontab’
  • ‘crontab’명령어의 ‘-e’옵션을 사용하거나 직접 파일(crontab)에 추가
#crontab [옵션]

[옵션]
-l: /etc/crontab파일의 내용 출력
-e: /etc/crontab파일을 작성하거나 수정
-r: /etc/crontab파일의 내용 삭제
-u [사용자명]: 특정 사용자의 일정 수정 (-e -u [사용자명] 주로 사용)

crontab -e -u yb  #yb사용자의 cron작업 작성

cf) /etc/crontab파일 내용은 [분] [시] [일] [월] [수행명령] 순

[/etc/crontab]
0 12 * * 1-5 /etc/check.sh
  # 월요일(1)부터 금요일(5) 오후 12시에 /etc/check.sh 스크립트 수행
0 7 1 1-10/2 * /etc/check2.sh
  # 1월부터 10월까지 2달 주기로 1일 오전 7시마다 /etc/check2.sh 스크립트 수행

Leave a Comment