nayoungs
항상 끈기있게
nayoungs
  • 분류 전체보기 (274)
    • Cloud (21)
      • AWS (15)
      • Azure (3)
      • NCP (2)
      • GCP (1)
    • DevOps (68)
      • Docker (16)
      • Kubernetes (50)
      • CICD (2)
    • IaC (25)
      • Ansible (17)
      • Terraform (8)
    • Certification (4)
    • 금융 IT (5)
    • AI (3)
    • Linux (47)
    • 미들웨어 (5)
    • Programming (7)
      • GoLang (3)
      • Spring (4)
    • CS (25)
      • 네트워크 (17)
      • 운영체제 (5)
      • Web (1)
      • 개발 상식 (2)
      • 데이터베이스 (0)
    • Algorithm (59)
      • 프로그래머스 (36)
      • 백준 (18)
      • 알고리즘 정리 (5)
    • ETC (5)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
nayoungs

항상 끈기있게

Linux

[Linux] 시스템 프로세스 관리(Process Management)

2022. 2. 21. 21:40
728x90

📌INDEX

  • 프로세스(process)란?
  • 프로세스의 종류
  • ps와 pstree
  • 포그라운드와 백그라운드 프로세스
  • SIGNAL
  • 우선순위
  • 프로세스 실습(문제)



✔️ 프로세스(process)란?

  • 컴퓨터의 CPU에서 실행되는 모든 프로그램
    • 하드디스크에 저장된 실행 코드(프로그램)가 메모리에 로딩되어 활성화 된 것
  • 컴퓨터의 구성 요소
    • CPU
    • memory : 주기억장치
      • 휘발성: 전원이 있는 상태에서만 사용가능, 전원이 공급되지 않으면 모든 자료 날라감
    • hdd, ssd : 보조기억장치
      • 비휘발성: 전원이 꺼지더라도 자료가 날라가지 않는다.
    • I/O device
  • 프로세스 생성
    • 기존 프로세스는 자체 주소 공간(fork)을 복제해서 새로운 구조를 생성
    • 모든 프로세스는 하위 프로세스 생성 가능
    • 보안 ID, 파일 설명자, 우선 순위, 환경 변수 등 상속
  • PID : 프로세스가 시작될 때 부여되는 고유한 ID 넘버
  • PPID : 부모 프로세스의 PID 값



✔️ 프로세스의 종류

  • 부모 프로세스와 자식 프로세스
    • 프로세스는 여러가지 기능을 수행함으로써 주어진 작업을 완료하며, 모든 기능이 완료되지 전까지는 종료될 수 없다.
      • 부모 프로세스는 여러 개의 자식 프로세스를 실행하여 다수의 작은 작업들을 동시에 처리하도록 할 수 있다.
    • 모든 프로세스는 혼자서 독립적으로 실행되는 것이 아니라 부모 프로세스의 하위에 종속되어 실행된다.
      • 부모 프로세스가를 종료하면, 그에 종속된 자식 프로세스도 모두 종료된다.
    • exec : 한 프로세스가 다른 프로세스를 생성(spawn)할 경우, 원래의 프로세스가 더는 남아 있을 필요가 없다면, exec호출을 통해서 다른 프로그램을 실행하고 새로운 프로세스로 자신을 대체할 수 있다.
    • fork : exec에 반해 원래 프로세스가 계속 존재해야한다면, fork를 호출하여 자신의 복사본 프로세스를 먼저 만들고 복사본 프로세스에서 다시 exec를 호출하여 다른 프로그램을 실행하는 새로운 프로세스로 자신을 대체한다.
    • 동작 방식
      • 부모 프로세스: fork 후 자식 프로세스의 동작 완료까지 대기
      • 자식 프로세스: 작업 완료 후 부모 프로세스에 신호 전달 후 종료
  • process의 종류: 프로세스는 고아 프로세스, 좀비 프로세스, 데몬 프로세스 등 으로 구분되어 진다.
  • 각 프로세스의 기본 규칙
    • 각각의 프로세스마다 고유 번호의 프로세스 ID(PID)를 하나씩 증가시키면서 부여
      • 더 이상 할당할 PID가 없으면, 사용되지 않는 가장 낮은 숫자로 되돌아가 다시 할당
    • 프로세스는 파일의 소유권과 유사한 방식의 소유권을 갖는다.
      • 프로세스를 실행하는 사용자의 UID가 프로세스의 실제 사용자 UID로 할당된다.
      • SetUID와 같은 특수한 경우, 실행하는 사용자의 UID가 아닌 파일의 소유가 실행한것 처럼 실행된다(EUID/EGID)
  • 고아 프로세스
    • 일반적으로 부모 프로세스가 죽게되면 자식 프로세스가 죽게된다.
    • 어떠한 이유로 인해서 부모 프로세스가 죽었음(종료)에도 불구하고, 자식 프로세스가 살아남는 경우를 고아 프로세스라 한다.
    • 부모 프로세스만 먼저 종료된 경우
  • 좀비 프로세스
    • 부모가 자식 프로세스를 탄생시키고, 자식 프로세스가 일을 끝내면 부모는 자식을 죽이고, 해당 리소스를 모두 회수한다.
    • 시스템적으로는 죽은 것(종료된 것)으로 표시되지만, 실제는 살아서 리소스를 갖고(잡고)있는 경우를 좀비프로세스라 한다.
    • 발생하는 경우
      • 자식 프로세스가 종료되었는데, 부모 프로세스에세 SIGCHLD 전달이 안되었을 때, 혹은 손실(lost) 되었을 때 발생
      • 자식 프로세스는 종료 되었는데, 부모 프로세스는 종료되지 않았거나, wait() 계열 함수를 호출해서 자식 프로세스를 정리하지 않았을 때 발생
    • 파일 등의 모든 자원 및 메모리 이미지 역시 해제 하였으며, 프로세스 테이블만 유지하고 있는 상태
    • 시스템적으로는 죽었기(종료되었기) 때문에 다시 죽이지는 못함
    • 이러한 좀비 프로세스가 많아지면, 리소스를 잡아먹어서 다른 프로세스를 할당하는 메모리가 부족해질 수 있다.
      • 전원을 끔으로써 좀비 프로세스를 종료할 수 있다.
  • 데몬 프로세스
    • 사용자가 아닌 시스템에 의해서 실행된 프로세스
    • 데몬은 특정 서비스를 위해 백그라운드 상태에서 계속 실행되는 서버 프로세스
      • 일반적인 서비스는 각각의 서비스가 사용하는 포트를 관리하는 데몬이 존재
      • 다른 데몬들에게 할당된 포트를 관리하는 특별한 용도의 데몬도 존재
      • 일반적으로 백신, 웹서비스와 같은 프로세스



✔️ ps와 pstree

  • ps
    • 현재 프로세스의 상태를 확인하는 명령어로, 현재 동작하고 있는 프로세스들의 상황(스냅샷)을 보여줌
    • 실시간으로 프로세스의 동작 상황을 확인하고 싶을 때는 top 명령어를 사용
    • Process 정보의 기본적인 내용은 proc 파일 시스템에 있는 stat의 내용에서 가져온다.
    • 옵션
      • -a : 현재 실행중인 전체 사용자의 모든 프로세스를 출력
      • -e : 모든 프로세스 정보 출력
      • -l : Long Format
      • -u : 프로세스를 실행한 사용자 정보와 프로세스 시작 시간 등을 출력
      • -x : 제어 터미널을 갖지 않는 프로세스 출력
      • -f : Full format 정보
      • 자주 사용하는 종합: ps -ef, ps aux
    • ps 명령어 주요 필드
      • USER : 프로세스를 실행시킨 사용자
      • PID : 프로세스 ID
      • %CPU : 최근 1분간 프로세스가 사용한 CPU 시간 백분율
      • %MEM : 최근 1분간 프로세스가 사용한 실제 메모리의 백분율
      • RSS : 현재 프로세스가 사용하고 있는 실제 메모리 크기
      • TTY : 프로세스를 제어하고 있는 터미널
      • STAT : 프로세스 상태 코드
      • START : 프로세스의 시작 시간
    • 프로세스의 번호 및 상태를 확인할 때는 'ps -ef | grep [프로세스 이름]' 명령 자주 사용
    • 사용 예
  • 현재 실행 중인 전체 사용자 정보와 프로세스 시작 시간 등 출력
[root@localhost ~]# ps -au
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
gdm         1435  0.0  0.2 338968  5252 tty1     Ssl+ 00:37   0:00 /usr/
gdm         1454  0.0  0.3 657500  6776 tty1     Sl+  00:37   0:00 /usr/
gdm         1481  0.0  5.2 2649784 96584 tty1    Sl+  00:37   0:06 /usr/
gdm         1632  0.0  0.2 260240  5136 tty1     S+   00:37   0:00 /usr/
gdm         1791  0.0  0.2 387792  5152 tty1     Sl   00:37   0:00 ibus-
gdm         1794  0.0  0.2 301552  4216 tty1     Sl   00:37   0:00 /usr/
gdm         1798  0.0  0.6 521404 11088 tty1     Sl   00:37   0:00 /usr/
gdm         1837  0.0  0.5 523092 10384 tty1     Sl+  00:37   0:00 /usr/
...
  • 사용자가 정의한 형색(o) 으로 모든 프로세스(e)를 보여줌
[root@localhost ~]# ps -eo pid,state,nice,args | head -10
    PID S  NI COMMAND
      1 S   0 /usr/lib/systemd/systemd --switched-root --system --deserialize 18
      2 S   0 [kthreadd]
      3 I -20 [rcu_gp]
      4 I -20 [rcu_par_gp]
      6 I -20 [kworker/0:0H-kblockd]
      9 I -20 [mm_percpu_wq]
     10 S   0 [ksoftirqd/0]
     11 R   0 [rcu_sched]
     12 S   - [migration/0]
  • sleep 프로세스의 full format 정보 출력
[root@localhost ~]# ps -ef | egrep '(sleep|PID)'
UID          PID    PPID  C STIME TTY          TIME CMD
root        3165    2861  0 01:00 pts/1    00:00:00 sleep 20000
root        6519     830  0 06:23 ?        00:00:00 sleep 60
root        6522    2861  0 06:23 pts/1    00:00:00 grep -E --color=auto (sleep|PID)
  • pstree
    • 현재 프로세스의 상황을 트리형식으로 보여줌
    • 옵션
      • -n : PID 순으로 정렬
      • -p : 프로세스명과 PID 함께 출력
    • 사용 예
[root@localhost ~]# pstree -np
systemd(1)─┬─systemd-journal(611)
           ├─systemd-udevd(646)
           ├─rpcbind(746)
           ├─auditd(750)─┬─{auditd}(751)
           │             ├─sedispatch(752)
           │             └─{auditd}(753)
           ├─rtkit-daemon(779)─┬─{rtkit-daemon}(838)
           │                   └─{rtkit-daemon}(839)
           ├─alsactl(781)
           ├─smartd(783)
           ├─lsmd(785)
           ├─sssd(786)─┬─sssd_be(837)
           │           └─sssd_nss(861)
           ├─udisksd(787)─┬─{udisksd}(795)
           │              ├─{udisksd}(835)
           │              ├─{udisksd}(886)
           │              └─{udisksd}(968)
           ├─dbus-daemon(788)───{dbus-daemon}(827)
           ├─ModemManager(789)─┬─{ModemManager}(806)
           │                   └─{ModemManager}(836)
           ├─avahi-daemon(793)───avahi-daemon(832)
           ├─VGAuthService(794)
           ├─vmtoolsd(796)─┬─{vmtoolsd}(829)
           │               └─{vmtoolsd}(850)
           ....



✔️ 포그라운드와 백그라운드 프로세스

  • 포그라운드(foreground) 프로세스
    • 실행하면 화면에 나타나서 사용자와 상호 작용하는 프로세스
    • shell 상태에서 명령을 내리면 사용자는 해당 프로세스가 종료될 때 까지 기다려야함(대기상태)
    • 특정 터미널 창으로 입력 및 키보드 생성 신호 수신 가능
  • 백그라운드(background) 프로세스
    • 실행은 되었지만 화면에 나타나지 않고, 뒤에서 실행되는 프로세스
    • 일반적으로 명령어 뒤에 '&' 를 붙여서 동작시키며, 명령을 내린 사용자는 자신이 하고자 하는 다른 명령어를 계속 실행할 수 있음
    • PID 값 출력 후 다시 프롬프트 표시
    • 예를 들어, 바이러스 백신, 서버 데몬 등은 눈에 보이지 않지만 실행된다.

관련 명령어

  • jobs
    • 백그라운드로 실행중인 프로세스나 현재 중지된 프로세스 목록을 출력해줌
    • 옵션 -l : PID와 함께 출력
[root@localhost ~]# jobs -l
[1]+  3165 Running                 sleep 20000 &
  • fg
    • fg는 백그라운드 프로세스를 포그라운드 프로세스로 전환하는 명령어
    • 백그라운드 프로세스가 여러개 존재할 경우, 별도의 작업 번호를 부여하지 않으면 현재 수행중인(+ 기호가 붙은) 작업을 전환
    • 사용법: fg %[작업번호]
[root@localhost ~]# jobs
[1]+  Running                 sleep 1000 &
[root@localhost ~]# fg %1
sleep 1000
  • bg
    • bg는 포그라운드 프로세스를 백그라운드 프로세스로 전환하는 명령어
    • 일반적으로 실행시키고 있는 포그라운드 프로세스에서 ctrl+z 키를 눌러 작업을 잠시 중지시킨 후에 bg 명령어를 사용하여 작업을 백그라운드로 전환함
[root@localhost ~]# fg %1
sleep 1000
^Z
[1]+  Stopped                 sleep 1000
[root@localhost ~]# bg
[1]+ sleep 1000 &
  • 전환 방법 정리
    • fg %작업번호 : 백그라운드 -> 포그라운드
    • Ctrl+z : 포그라운드 -> 백그라운드 / 일시 정지 상태
    • bg %작업번호 : 일시 정지 상태의 백그라운드 프로세스 시작



✔️ SIGNAL

  • 시그널이란? 프로세스에서 발생하는 비동기적인 사건(asynchronous event)
    • 갑자기 일어나는 이벤트
  • 한 프로세스가 다른 프로세스에게 보낼 수 있고, 커널이 프로세스에게 보낼 수도 있음
  • 비동기적이므로 어느 시점에서 시그널이 발생할 지 미리 예측할 수 없음
  • 시그널을 통해서 프로세스를 관리
  • SIGNAL이 발생하는 경우
    • 키보드를 통해 발생
      • ctrl + c (sigint) , ctrl + z (sigstop)
    • 다른 프로세스에 의해서 발생
    • 커널 내부에서 발생
      • kill(), alarm() 과 같은 시스템 콜
  • SIGNAL SYNTAX
    • kill [옵션] PID
      • PID default : -15
  • 주요 SIGNAL

  • -15 시그널 넘버로 죽일(종료) 수 없는 경우
    • 일시 정지 상태
    • shell(shell은 죽지 않음)
    • 이러한 경우, kill -9 명령어 사용
  • kill
    • 프로세스나 프로세스 그룹에게 지정된 시그널을 보내줌
    • 사용 예
      • PID 1234 vmfhtptmdptp SIGTERM(기본값) 신호 보내기
      [root@localhost ~]# kill PID
      • 다수의 프로세스 강제종료(SIGKILL 옵션을 주어도 동일)
      [root@localhost ~]# kill -9 PID1 PID2 PID3 PID4
      • 프로세스를 정보를 다시 읽어들임
      [root@localhost ~]# kill -HUP 1234
    • 작업 번호 단위로 종료
      • kill %[작업번호]
  • killall
    • kill 명령은 다수의 경우 각각의 PID 값을 알아내고 모두 입력해야 하나 데몬에 의해 동작되는 모든 프로세스에게 한번에 같은 시그널을 보낼 경우에 사용됨
    • 프로세스명 또는 데몬명으로 프로세스 종료시킴
    • 사용 예
      • 작업번호와 관련된 모든 프로세스에게 SIGTERM 보냄
      [root@localhost ~]# killall %1
      • ssh 데몬에 대한 환경설정 리로드 : ssh 연결 종료됨
      [root@localhost ~]# killall -s SIGHUP sshd
      • test1 사용자가 생성한 sleep 프로세스 제거
      [root@localhost ~]# killall -15 -u test1 sleep
  • skill
    • 주로 시스템에 접속해 있는 사용자 혹은 특정 터미널을 종료시키는데 사용
    • 불필요한 접속자 혹은 공격자 등을 차단하는 경우
    • 사용 예
      • testuser1 이라는 사용자를 시스템에서 추방
      [root@localhost ~]# skill -KILL user
      • 특정 터미널인 pts/0 에 접속해 있는 사용자만 추방
      [root@localhost ~]# skill -KILL pts/0
      • 특정 사용자를 정지시킴
      [root@localhost ~]# skill -STOP testuser1
  • 프로세스 제어 관련 명령어
    • pgrep
      • 프로세스에 대해 특정 정보를 이용한 검색 기능
      • ps + grep과 같은 효과
      • 조건: killall의 조건 + PPID, terminal
      • 조건이 충당되는 것 중 제일 최신 프로세스만 선택하는 것도 가능
    • pkill
      • killall과 같이 복수의 프로세스에 신호 전달 가능
      • -t 옵션과 함께 사용하면, 터미널 별로 관리 가능
      • +pgrep과 같은 특정 조건으로 신호 전달 가능
      • 장점: 여러 프로세스 통시에 제어 가능
      • 단점: 예상치 못한 프로세스 제어
      • 사용 예
      [root@localhost ~]# pkill -15 -t pts/1 sleep



✔️ 우선순위

  • 우선순위란? 프로세스의 처리 순서
  • 중요도에 따른 가중치 부여
  • 기본 값(priority) + 조정 값(nice)
  • nice 값
    • 높을 수록 우선순위 하락
    • 프로세스 실행 시 설정 - nice 명령어 사용
    • 동작 중 변경 가능 - renice 명령어 사용

사용 예

  • 프로세스 실행 시 부여
[root@localhost ~]# nice -n 100 sleep 1000 &
[1] 7245
[root@localhost ~]# ps -l
F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S     0    7028    7023  0  80   0 -  6530 -      pts/1    00:00:00 bash
0 S     0    7245    7028  0  99  19 -  1435 hrtime pts/1    00:00:00 sleep
0 R     0    7246    7028  0  80   0 - 10975 -      pts/1    00:00:00 ps
  • 실행 중인 프로세스 변경
[root@localhost ~]# renice -n 19 7028
7028 (process ID) old priority 0, new priority 19

​



✔️ 프로세스 실습(문제)

  1. sleep, gedit, firefox 의 PID와 PPID가 무엇인지 확인하시오.
[root@localhost ~]# ps -ef | grep sleep gedit firefox
[root@localhost ~]# ps -ef | egrep `(sleep|gedit|firefox)`
  1. pts/2 번에서 sleep 2000을 포그라운드로 실행시키고 백그라운드로 보내라.
[root@localhost ~]# sleep 2000
^Z
[3]+  Stopped                 sleep 2000
[root@localhost ~]# bg %3
[3]+ sleep 2000 &
  1. firefox를 kill 명령어로 kill 하라
[root@localhost ~]# kill -15 [firefox PID]
  1. pts/0, pts/3의 sleep 프로세스를 kill 하라
[root@localhost ~]# pkill -15 -t pts/1, pts/3 sleep
  1. nice 값 -11의 우선 순위로 sleep 2000을 실행시키시오
[root@localhost ~]# nice -n -11 sleep 2000 &
[root@localhost ~]# ps -l | egrep '(sleep|NI)'
  1. 5번에 이어서 nice 값을 4로 수정해보시오
[root@localhost ~]# renice -n 4 sleep 7460
728x90
저작자표시 (새창열림)
    'Linux' 카테고리의 다른 글
    • [Linux] 시스템 사용자, 그룹 관리
    • [Linux] 파일 아카이브(Archive)
    • [Linux] shell 메타문자(Metacharacter)
    • [Linux] shell(script) 기본 문법 정리
    nayoungs
    nayoungs
    안되면 될 때까지

    티스토리툴바