리눅스 마스터 2급 대비 정리(6) (프로세스 관리 - 개념 및 유형, 프로세스 유틸리티)
리눅스 마스터 2급 시험 대비를 위해 관련 책을 바탕으로 내용들을 정리하는 포스트입니다. 이번 포스트는 리눅스의 프로세스 관리를 이해하는 파트로 프로세스의 개념 및 유형, 프로세스 유틸리티에 대해 알아보겠습니다.
개요
이번 포스트는 프로세스 관리의 개념 및 유형, 프로세스 유틸리티에 대해 알아보겠습니다. 참고한 책은 2023 이기적 리눅스 마스터 2급 기본서 - 권소라 저, 영진닷컴입니다. 실습한 리눅스 버전은 CentOS 7이고, ISO 명은 CentOS-7-x86_64-Minimal-2009.iso입니다.
목차
개념 및 유형
프로세스의 개념
- 프로세스는 CPU와 메모리를 할당받아 실행시키는 프로그램을 말합니다.
- 프로세스들마다 고유의 프로세스 IP(PID)를 할당받습니다.
- 가장 먼저 실행되는 프로세스는 init이고, 해당 PID는 1입니다.
- 프로세스 init에 의해 다른 모든 프로세스들이 시작됩니다.
- 예) 응용 프로그램, 명령어 등
프로세스 유형
- 프로세스를 실행 형태에 따라 Foreground와 Background 프로세스로 나눕니다.
- 사용자와 상호작용하는 Foreground 프로세스의 설명은 다음과 같습니다.
- 터미널에 직접 연결되어 입출력을 주고받는 프로세스
- 명령 입력 후 수행 종료까지 기다려야하는 프로세스
- 화면에서 실행되는 것이 보이는 프로세스
- 사용자와 직접 상호작용하지 않고 뒤에서 실행되는 프로세스인 Background의 설명은 아래와 같습니다.
- 사용자의 입력에 관계없이 실행되는 프로세스
- 실행은 되지만 화면에 나타나지 않고 실행되는 프로세스
- 예) 시스템 프로그램, 데몬 등
fork()와 exec()
- 사용자가 새로운 프로세스를 생성하기 위해 사용하는 시스템 호출 함수입니다
- fork() 함수의 경우 아래와 같은 역할을 합니다
- 새로운 프로세스를 만들 때 기존 프로세스를 복제하는 방식을 사용합니다
- 새로운 프로세스를 위한 메모리를 할당합니다
- 새로 생성된 프로세스는 원래의 프로세스와 똑같은 코드를 가지고 있습니다
- 원본 프로세스를 Parent Process라 하고, 새로 복제된 프로세스를 Child Process라 합니다
- exec()함수의 경우 아래와 같은 역할을 합니다
- 호출하는 프로세스가 새로운 프로세스로 변경되는 방식입니다
- 새로운 프로세스를 위한 메모리를 할당하지 않습니다
- 호출한 프로세스의 메모리에 새로운 프로세스의 코드를 덮어씌워 버립니다
- exec()를 호출한 프로세스가 아닌 exec()에 의해 호출된 프로세스만 메모리에 남게 됩니다
데몬(Daemon)
- 리눅스 시스템이 부팅 시 자동으로 실행되는 백그라운드 프로세스입니다
- 메모리에 상주하면서 사용자의 특정 요청이 오면 즉시 실행되는 대기 중인 서버 프로세스입니다
- 주기적이고 지속적인 서비스 요청을 처리하기 위해 실행됩니다
- 사용자들은 이 프로세스들을 볼 수 있는 권한이 없습니다
- 리눅스에서 데몬을 실행하는 방법은 아래 세가지가 있습니다
- Standalone Daemon
- 서비스가 요청이 들어오기 전에 서비스가 메모리에 상주하는 단독 실행 방식
- 독립적으로 수행되며 서비스 요청에 응답하기 위해 항상 메모리에 상주
- 빠른 응답속도를 요하는 경우 사용
- 메모리에 항상 상주하므로 메모리 점유로 인한 서버 부하가 큼
- 실행 스크립트 위치는 “/etc/inetd.d”
- 관련 서비스: http, mysql, nameserver, sendmail
- inetd Daemon(슈퍼 데몬)
- inetd는 다른 데몬들의 상위에 존재하는 standalone Daemon
- inetd는 자체적으로는 하나의 독립 데몬이지만 여러 가지 다른 서비스들을 제어하고 관리함
- 보안상의 이유로 리눅스 커널 2.4버전부터 xinetd(extended inetd)가 inetd 역할을 수행
- inetd Type Daemon
- inetd 타입 데몬들은 직접 서비스를 가동하지 못하고 inetd 데몬이 활성화가 되어야만 해당 서비스 제공
- Telnet, FTP, rlogin과 같은 데몬들이 inetd 타입 데몬에 해당
- inetd 서비스 요청이 종료되면 inetd 타입 데몬들도 자동으로 종료
- 실행 스크립트 파일 위치는 “/etc/xinetd.d”
시그널(Signal)
- 시그널은 프로세스에게 이벤트 발생을 전달해주는 소프트웨어 인터럽트입니다
- 시그널이 프로세스에게 전달될 때 아래 4가지 상황이 발생합니다.
- SIG_IGN (SIG_PF)1: 운영체제에 의해 시그널이 무시된다
- SIG_ERR (SIG_PF)-1: 운영체제는 프로그램을 강제로 종료한다
- SIG_DFL (SIG_PF)0: 지정한 시그널 처리 루틴을 실행한다
- SIG_HOLD (SIG_PF)2: 시그널이 블로킹 된다.
- 명령어 kill -l로 시그널 리스트를 확인할 수 있습니다
- 아래 표는 지정된 이벤트의 시그널이 프로세스에 전달될 때 어떤 기본 동작을 하는지 나타내는 것입니다
번호 | 시그널 | 발생 조건 | 기본 동작 |
---|---|---|---|
1 | SIGHUP | 터미널과 연결이 끊어졌을 때 | 종료 후 재시작 |
2 | SIGINT | Ctrl+c 입력 시 | 종료 |
3 | SIGQUIT | Ctrl+\ 입력 시 | 코어덤프 |
6 | SIGABRT | abort(비정상 종료) 함수에 의해 발생 | 코어덤프 |
9 | SIGKILL | 프로세스 강제 종료 시 | 종료 |
13 | SIGPIPE | 종료된 소켓에 쓰기를 시도할 때 | 코어덤프 |
14 | SIGALRM | 알람 타이머 만료 시 | 코어덤프 |
15 | SIGTERM | Kill 시스템 호출 시 | 종료 |
17 | SIGCHID | 자식 프로세스가 종료 시 | 무시 |
18 | SIGCONT | 중지된 프로세스 실행 시 | 무시 |
19 | SIGSTOP | SIGCONT 시그널을 받을 때까지 | 종료 |
20 | SIGTSTP | Ctrl+z 입력 시 | 프로세스 대기로 전환 |
프로세스 유틸리티
프로세스 관련 명령어
| 명령어 | 형태 | 설명 | | :—: | :—: | :—: | | ps(process status) | ps [옵션] | 현재 실행 중인 프로세스의 상태를 보여주는 명령어로 CPU 사용도가 낮은 순서대로 출력 | | pstree | pstree [옵션] | 실행 중인 프로세스들을 트리 구조로 나타냄 | | jobs | jobs [옵션] [작업번호] | 작업이 중지된 상태, 백그라운드로 진행 중인 상태, 변경되었지만 보고되지 않은 상태 등을 표시 | | bg & fg | bg|fg %작업번호 or bg|fg 작업번호 | Foreground에서 background로 전환하거나 그 반대로 전환하는 명령어 | | kill | kill [옵션] [시그널번호|시그널이름] [PID|%작업번호] | 프로세스를 종료시킨다 | | killall | killall [옵션] 프로세스명 | 같은 데몬의 여러 프로세서를 한 번에 종료시킬 때 사용, 프로세스명으로 연관된 프로세스들을 종료시킨다 | | nice | nice [옵션] 프로세스명 | 프로세스 사이의 우선순위를 변경할 수 있는 명령어, 옵션으론 -n 조정수치 or -조정수치 or –adjustment 조정수치 모두 명령의 우선권에 조정수치를 더함(양수값: -, 음수값: –), 우선순위 값이 작을 수록 우선순위가 높다. 범위는 -20~19 | | renice | renice [옵션] NI값 PID | 이미 실행중인 프로세스의 우선순위를 변경한다 | | top | top [옵션] [PID] | 리눅스 시스템의 운영 상태를 실시간으로 모니터링하거나 프로세스 상태를 확인할 수 있다 | | nohup | | 프로세스가 중단되지 않고 백그라운드로 작업을 수행할 수 있게 한다, 백그라운드로 실행될 수 있도록 명령행 뒤에 ‘&’를 명시한다 | | tail | tail [옵션] [파일명] | 파일의 마지막 행을 기준으로 지정한 행까지 파일 내용의 일부를 출력한다. 기본값으로 마지막 10줄을 출력한다 |
ps명령 실행시 자신의 터미널에서 실행되고 있는 프로세스들의 정보 | 상태 | 설명 | | :—: | :—: | | PID | 프로세스 식별번호 | | TTY | 프로세스와 연결된 터미널 번호 | | TIME | 총 CPU 사용 시간 | | CMD | 실행 명령 |
ps에서 많이 사용하는 옵션 | 옵션 | 설명 | | :—: | :—: | | a | 현재 실행 중인 모든 프로세스 출력 | | e | 모든 프로세스 정보 | | u | 사용자 이름과 프로세스 시작 시간 출력 | | x | 접속된 터미널 뿐만 아니라 사용되거 있는 모든 프로세스들을 출력 | | l | 자세한 정보 출력 |
ps aux 수행 시 나오는 정보 | 상태 | 설명 | | :—: | :—: | | USER | 프로세스 소유자명(계정명) | | PID | 프로세스 식별 번호 | | %CPU | CPU 사용 비율의 추정치 | | %MEM | 메모리 사용 비율의 추정치 | | VSZ | 페이지 단위의 가상메모리 사용량 | | RSS | 실제 사용된 메모리량 | | TTY | 프로세스와 연결된 터미널 번호 | | STAT | 현재 프로세스 상태(P(수행 가능/수행 중), R(현재 실행 상태), S(잠든 상태, 20초 이상 된 상태), D(I/O 작업이 끝나기를 기다리며 정지된 상태), T(정지된 상태. 일시 정지 상태), Z(좀비 프로세스, 작업종료 후 부모 프로세스로부터 회수되지 않아 메모리에 적재되어 있는 상태)) | | START | 프로세스 시작 시간 | | TIME | 총 CPU 사용 시간 | | COMMAND | 실행 명령 |
ps -l 수행 시 나오는 정보 | 상태 | 설명 | | :—: | :—: | | F | 프로세스 플래그로 8진수 값의 합을 나타냄(01(주기억장치 내에 있음), 02(시스템 프로세스), 04(주기억장치 내에서 잠김), 10(스왑되고 있음), 20(다른 프로세스에 의해 추적되고 있음)) | | S | 프로세스 상태를 표시 (Running, Terminated, Sleeping, Stopped, Waiting, Intermediated) | | UID | 프로세스 소유자의 Username | | PPID | 부모 프로세스 PID | | C | 짧은 시간 동안의 CPU 사용률 | | PRI | 실행 우선순위 값, 값이 적을수록 우선순위가 높음 | | NI | NICE 우선순위를 계산할 때 사용되는 nice값 | | ADDR | 프로세스의 주기억장치 내의 주소 | | SZ | 프로세스 크기로 단위는 블록 | | WCHAN | 프로세스가 대기나 수면 상태에서 기다리는 사건, 기다리는 사건이 실행될 주기억장치 내의 주소를 가리킴, 실행 중인 프로세스는 공백 |
pstree 옵션 | 옵션 | 설명 | | :—: | :—: | | -p | 프로세스 ID 표시 | | -n | 프로세스 ID를 정렬해서 표시 | | -a | 명령행 인자를 포함한 정보를 트리구조에 표시 | | -h | 현재 프로세스와 해당 프로세스의 부모 프로세스를 음영으로 강조해서 표시 |
jobs 옵션 | 옵션 | 설명 | | :—: | :—: | | -l | 프로세스 그룹 ID를 state 필드 앞에 표시 | | -n | 프로세스 그룹 중 대표 프로세스 ID 표시 | | -p | 프로세스 ID를 한 행씩 표시 |
jobs의 상태값 | 상태 | 설명 | | :—: | :—: | | Running | 작업이 일시 중단되지 않았고 종료하지 않고 계속 진행 중 | | Stopped | 작업이 일시 중단 | | Done | 작업이 완료되어 0을 반환하고 종료 | | Done(code) | 작업이 정상적으로 완료되었으며, 0이 아닌 코드를 반환 |
kill 옵션 | 옵션 | 설명 | | :—: | :—: | | -l | 시그널 종류 나열 | | -s 시그널번호 or -s 시그널명 | 전달할 시그널의 종류를 지정 | | -1 | HUP, 프로세스를 재시작 | | -9 | 프로세스를 강제로 종료 |
killall 옵션 | 옵션 | 설명 | | :—: | :—: | | -g | 그룹을 지정해 프로세스 종료, 같은 프로세스 그룹에 속한 여러 프로세스가 발견되더라도 시그널은 그룹별로 한 번만 보내짐 | | -i | 프로세스 종료 전 확인 메시지 표시 | | -l | 시그널 목록 표시 | | -v | 상세 정보 표시 |
renice 옵션 | 옵션 | 설명 | | :—: | :—: | | -p | 프로세스 ID 지정 | | -u | 사용자명 지정 | | -g | 프로세스 GID 지정 |
top 옵션 | 옵션 | 설명 | | :—: | :—: | | -d 시간 | 실시간 화면 출력 시간 지정(초 단위) | | -p PID | 모니터할 프로세스 ID(PID) 지정 |
pstree 수행 시 나오는 정보 | 상태 | 설명 | | :—: | :—: | | PID | 프로세스 식별자 번호 | | USER | 프로세스 소유자 | | PR | 프로세스의 우선순위 | | NI | 프로세스 NICE값 | | VIRT | 해당 프로세스가 사용하는 가상 메모리의 총량(Virtual Image(kb)) | | RES | 해당 프로세스의 물리적 메모리 사용량(Resident Size(kb)) | | SHR | 해당 프로세스에 의해 사용된 공유 메모리 총량(Shared Mem Size(kb)) | | S | 해당 프로세스의 상태 (D(중단될 수 없는 Sleep 상태), R(실행중인 상태), S(휴면 상태), T(Trace되거나 정지된 프로세스), Z(좀비 프로세스)) | | %CPU | 해당 프로세스의 CPU 사용률 | | %MEM | 해당 프로세스의 메모리 사용률 | | TIME+ | 100분의 1초 단위로 나타내는 CPU 사용 시간 |
pstree 수행 시 나오는 정보 | 입력 | 설명 | | :—: | :—: | | h or ? | 도움말 확인 | | t | 두 번째와 세 번째 행 정보만 CPU와 프로세스 정보를 보여주거나 감춤(Toggle) | | i | 좀비 프로세스 정보를 보여주거나 감춤(Toggle) | | n 수치 | 지정된 개수만큼의 프로세스만을 화면에 표시 | | r 조정치 | renice값을 변경해 실행 우선순위 조정 | | k PID | 지정된 PID를 종료 | | q or Ctrl+C | top 실행 종료 |
tail 옵션 | 옵션 | 설명 | | :—: | :—: | | -f | 파일의 10줄을 출력하고 파일의 내용을 실시간으로 출력 | | -n N | N 개만큼의 라인을 출력 |
스케줄링과 cron
- 주기적으로 반복되는 일을 자동적으로 실행될 수 있도록 설정합니다
- 스케줄링 데몬은 “crond”이며, 관련 파일은 “/etc/corntab”입니다
- 파일 /etc/crontab은 7개의 필드로 구성되어 있습니다.
- 명령어 crontab은 사용자가 주기적인 작업을 등록할 수 있게 합니다.
- 형식은 crontab [옵션] 파일명 입니다.
- 옵션은 -l: crontab에 설정된 내용 출력
- -e: crontab을 작성하거나 수정
- -r: crontab 내용 삭제
- -u: 특정 사용자의 일정 수정
- 예시: 백업 스크립트 파일 /etc/backup.sh를 매주 화요일과 목요일 오전 4시에 실행한다. /etc/crontab에 * 4 * * 2,4 /etc/backup.sh를 추가하면 됩니다.