[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 alone과 inetd(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에 시그널 호출
시그널 번호 | 시그널 | 발생 조건 | 기본 동작 |
---|---|---|---|
1 | SIGHUP | 터미널과 연결이 끊어졌을 때 | 종료 후 재시작 |
2 | SIGINT | 현재 프로그램의 동작을 멈출 때 [Ctrl] + [C] 입력 시 | 종료 |
3 | SIGQUIT | 사용자가 터미널에서 종료키를 누를 때 [Ctrl] + [\] 입력 시 | 코어 덤프 |
6 | SIGABRT | abort(비정상 종료)함수에 의해 발생 | 코어 덤프 |
9 | SIGKILL | 프로세스 강제 종료 시 | 종료 |
13 | SIGPIPE | 종료된 소켓에 쓰기를 시도할 때 | 코어 덤프 |
14 | SIGALRM | 알람 타이머 만료 시 | 코어 덤프 |
15 | SIGTERM | 정상 종료 시 | 종료 |
17 | SIGCHLD | 자식 프로세스가 종료 시 | 무시 |
18 | SIGCONT | 중지된 프로세스 실행 시 | 무시 |
19 | SIGSTOP | SIGCOUNT 시그널을 받을 때까지 | 종료 |
20 | SIGTSTP | [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 | 실행 우선순위. 짧을 수록 우선순위가 높음 |
NI | NICE 우선순위를 계산할 때 사용되는 Nice 값 |
ADDR | 프로세스의 주기억장치 내의 주소 |
SZ | 프로세스 크기. 블록 단위 |
WCHAN | 프로세스가 대기나 수면상태에서 기다리는 사건 기다리는 사건이 실행될 주기억장치 내의 주소를 가리킴 실행중인 프로세스는 공백 |
#ps -aux
상태 | 설명 |
---|---|
USER | 프로세스 계정명 |
%CPU | CPU 사용 비율의 추정치 |
%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 스크립트 수행