제목

리눅스 마스터 2급 대비 정리(6) (프로세스 관리 - 개념 및 유형, 프로세스 유틸리티)

   2023년08월18일     15분읽었습니다.

리눅스 마스터 2급 시험 대비를 위해 관련 책을 바탕으로 내용들을 정리하는 포스트입니다. 이번 포스트는 리눅스의 프로세스 관리를 이해하는 파트로 프로세스의 개념 및 유형, 프로세스 유틸리티에 대해 알아보겠습니다.


개요

이번 포스트는 프로세스 관리의 개념 및 유형, 프로세스 유틸리티에 대해 알아보겠습니다. 참고한 책은 2023 이기적 리눅스 마스터 2급 기본서 - 권소라 저, 영진닷컴입니다. 실습한 리눅스 버전은 CentOS 7이고, ISO 명은 CentOS-7-x86_64-Minimal-2009.iso입니다.

목차

  1. 개념 및 유형
  2. 프로세스 유틸리티

개념 및 유형

프로세스의 개념

  1. 프로세스는 CPU와 메모리를 할당받아 실행시키는 프로그램을 말합니다.
  2. 프로세스들마다 고유의 프로세스 IP(PID)를 할당받습니다.
    • 가장 먼저 실행되는 프로세스는 init이고, 해당 PID는 1입니다.
    • 프로세스 init에 의해 다른 모든 프로세스들이 시작됩니다.
    • 예) 응용 프로그램, 명령어 등

프로세스 유형

  1. 프로세스를 실행 형태에 따라 Foreground와 Background 프로세스로 나눕니다.
  2. 사용자와 상호작용하는 Foreground 프로세스의 설명은 다음과 같습니다.
    • 터미널에 직접 연결되어 입출력을 주고받는 프로세스
    • 명령 입력 후 수행 종료까지 기다려야하는 프로세스
    • 화면에서 실행되는 것이 보이는 프로세스
  3. 사용자와 직접 상호작용하지 않고 뒤에서 실행되는 프로세스인 Background의 설명은 아래와 같습니다.
    • 사용자의 입력에 관계없이 실행되는 프로세스
    • 실행은 되지만 화면에 나타나지 않고 실행되는 프로세스
    • 예) 시스템 프로그램, 데몬 등

fork()와 exec()

  1. 사용자가 새로운 프로세스를 생성하기 위해 사용하는 시스템 호출 함수입니다
  2. fork() 함수의 경우 아래와 같은 역할을 합니다
    • 새로운 프로세스를 만들 때 기존 프로세스를 복제하는 방식을 사용합니다
    • 새로운 프로세스를 위한 메모리를 할당합니다
    • 새로 생성된 프로세스는 원래의 프로세스와 똑같은 코드를 가지고 있습니다
    • 원본 프로세스를 Parent Process라 하고, 새로 복제된 프로세스를 Child Process라 합니다
  3. exec()함수의 경우 아래와 같은 역할을 합니다
    • 호출하는 프로세스가 새로운 프로세스로 변경되는 방식입니다
    • 새로운 프로세스를 위한 메모리를 할당하지 않습니다
    • 호출한 프로세스의 메모리에 새로운 프로세스의 코드를 덮어씌워 버립니다
    • exec()를 호출한 프로세스가 아닌 exec()에 의해 호출된 프로세스만 메모리에 남게 됩니다

데몬(Daemon)

  1. 리눅스 시스템이 부팅 시 자동으로 실행되는 백그라운드 프로세스입니다
  2. 메모리에 상주하면서 사용자의 특정 요청이 오면 즉시 실행되는 대기 중인 서버 프로세스입니다
  3. 주기적이고 지속적인 서비스 요청을 처리하기 위해 실행됩니다
  4. 사용자들은 이 프로세스들을 볼 수 있는 권한이 없습니다
  5. 리눅스에서 데몬을 실행하는 방법은 아래 세가지가 있습니다
  6. Standalone Daemon
    • 서비스가 요청이 들어오기 전에 서비스가 메모리에 상주하는 단독 실행 방식
    • 독립적으로 수행되며 서비스 요청에 응답하기 위해 항상 메모리에 상주
    • 빠른 응답속도를 요하는 경우 사용
    • 메모리에 항상 상주하므로 메모리 점유로 인한 서버 부하가 큼
    • 실행 스크립트 위치는 “/etc/inetd.d”
    • 관련 서비스: http, mysql, nameserver, sendmail
  7. inetd Daemon(슈퍼 데몬)
    • inetd는 다른 데몬들의 상위에 존재하는 standalone Daemon
    • inetd는 자체적으로는 하나의 독립 데몬이지만 여러 가지 다른 서비스들을 제어하고 관리함
    • 보안상의 이유로 리눅스 커널 2.4버전부터 xinetd(extended inetd)가 inetd 역할을 수행
  8. inetd Type Daemon
    • inetd 타입 데몬들은 직접 서비스를 가동하지 못하고 inetd 데몬이 활성화가 되어야만 해당 서비스 제공
    • Telnet, FTP, rlogin과 같은 데몬들이 inetd 타입 데몬에 해당
    • inetd 서비스 요청이 종료되면 inetd 타입 데몬들도 자동으로 종료
    • 실행 스크립트 파일 위치는 “/etc/xinetd.d”

시그널(Signal)

  1. 시그널은 프로세스에게 이벤트 발생을 전달해주는 소프트웨어 인터럽트입니다
  2. 시그널이 프로세스에게 전달될 때 아래 4가지 상황이 발생합니다.
    • SIG_IGN (SIG_PF)1: 운영체제에 의해 시그널이 무시된다
    • SIG_ERR (SIG_PF)-1: 운영체제는 프로그램을 강제로 종료한다
    • SIG_DFL (SIG_PF)0: 지정한 시그널 처리 루틴을 실행한다
    • SIG_HOLD (SIG_PF)2: 시그널이 블로킹 된다.
  3. 명령어 kill -l로 시그널 리스트를 확인할 수 있습니다
  4. 아래 표는 지정된 이벤트의 시그널이 프로세스에 전달될 때 어떤 기본 동작을 하는지 나타내는 것입니다
번호시그널발생 조건기본 동작
1SIGHUP터미널과 연결이 끊어졌을 때종료 후 재시작
2SIGINTCtrl+c 입력 시종료
3SIGQUITCtrl+\ 입력 시코어덤프
6SIGABRTabort(비정상 종료) 함수에 의해 발생코어덤프
9SIGKILL프로세스 강제 종료 시종료
13SIGPIPE종료된 소켓에 쓰기를 시도할 때코어덤프
14SIGALRM알람 타이머 만료 시코어덤프
15SIGTERMKill 시스템 호출 시종료
17SIGCHID자식 프로세스가 종료 시무시
18SIGCONT중지된 프로세스 실행 시무시
19SIGSTOPSIGCONT 시그널을 받을 때까지종료
20SIGTSTPCtrl+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

  1. 주기적으로 반복되는 일을 자동적으로 실행될 수 있도록 설정합니다
  2. 스케줄링 데몬은 “crond”이며, 관련 파일은 “/etc/corntab”입니다
  3. 파일 /etc/crontab은 7개의 필드로 구성되어 있습니다.
  4. 명령어 crontab은 사용자가 주기적인 작업을 등록할 수 있게 합니다.
    • 형식은 crontab [옵션] 파일명 입니다.
    • 옵션은 -l: crontab에 설정된 내용 출력
    • -e: crontab을 작성하거나 수정
    • -r: crontab 내용 삭제
    • -u: 특정 사용자의 일정 수정
    • 예시: 백업 스크립트 파일 /etc/backup.sh를 매주 화요일과 목요일 오전 4시에 실행한다. /etc/crontab에 * 4 * * 2,4 /etc/backup.sh를 추가하면 됩니다.

참고 자료

  1. 2023 이기적 리눅스 마스터 2급 기본서 - 권소라 저, 영진닷컴