현대 오토에버 SW 스쿨 - 클라우드/리눅스

[리눅스] - 리눅스의 프로세스 관리

yongyongMom 2024. 9. 5. 12:21
SMALL
    •  

리눅스 프로세스 관리

  • 실행 중인 프로그램으로 리눅스는 다중 프로세스 시스템입니다. 
  • 프로세스는 부모-자식 관계를 가지고 생성합니다. 프로세스 관리는 부모 프로세스로 제어합니다. 
  • 이를 구분하는 방법 중 하나로 시스템 프로세스사용자 프로세스로 나누기도 합니다. 
  • 리눅스가 부팅이 될 때 systemd 라 프로세스와 kthreadd 프로세스가 만들어지는데 이 프로세스를 제외한 모든 프로세스는 부모 프로세스가 존재합니다. 
  • 자식 프로세스는 부모 프로세스에 의해 만들어지고 자식 프로세스는 자신의 작업이 종료되면 부모 프로세스에게 결과를 돌려주고 종료됩니다. 
  • 결과는 정상 수행이나 에러로 인한 종료를 구분하기 위한 값입니다.  
  • 로그인-> bash shell 을 실행 -> vi 편집기를 실행 ::  vi 프로세스가 자식 프로세스, bash shell 이 부모 프로세스가 됩니다. 
  • vi 편집기를 종료하면 결과를 bash shell 에게 전달하고 종료합니다. 

프로세스 번호 

  • PID :: 편리성을 위해 프로세스에게 부여하는 고유한 번호입니다. 
  • 이름이 아닌 번호를 사용하는 이유 :: 하나의 프로그램을 동시에 여러번 실행 가능하기에 네이밍 방법으로는 구분하기 어렵습니다. 
  • 1번 부터 일련번호 형태로 부여되고 부팅될 때 실행되는 systemd 가 1번이고 kthread 가 2번으로 생성되고 나머지 프로세스는 이들의 자식 프로세스로 생성됩니다. 
  • 유닉스에서는 init 프로세스가 1번이었지만 우분투는 init의 이름을 systemd 로 변경했습니다. 
  • open source 여서 수정하여 사용하여도 가능하지만 기존의 사용자를 고려하며 이전의 것을 반영하며 수정을 행합니다. 

프로세스 종류

  • 리눅스의 프로세스 중 사용자가 실행한 경우에는 잠깐 실행되었다가 종료됩니다. 

Daemon

  • 특정 서비스를 제공하기 위해 존재하며 커널에서 실행됩니다.
  • 평소에는 대기 상태로 있다가 서비스 요청이 들어오면 서비스를 제공합니다. 
  • 서버에서 구동되는 프로세스들이 여기에 해당되는 경우가 많습니다. 
  • 계속해서 켜져있거나 작업시간이 오래걸리는 프로세스는 Daemon 으로 만들어야합니다. 
  • Orphan Process (고아 프로세스) 
>> 자식 프로세스가 아직 실행 중 인데 부모 프로세스가 먼저 종료되면 자식 프로세스는 고아 프로세스가 됩니다. 
>> 1번 프로세스가 새로운 부모 프로세스가 됩니다. 고아 프로세스가 정상적으로 종료되도록 1번 프로세스가 관리합니다. 하지만 일반적으로 종료가 안될 가능성이 매우 높습니다. 
  • Zombie Process (좀비 프로세스)
>> 종료 사실을 부모 프로세스에게 알려주고 프로세스가 종료된 경우 부모 프로세스의 자식 프로세스 테이블에 남아있는 형태를 말합니다. 
>> 자식 프로세스의 종료를 부모 프로세스가 정상적인 처리를 하지 못한 경우 발생합니다. 
>> 프로세스 목록에 defunct 프로세스라고 합니다. 
>> 고아 프로세스와 달리 메모리도 할당되지 않고 이름만 남아있지만 자식 프로세스 테이블의 용량을 차지하여 정상적인 자식 프로세스        가 실행되는데 문제가 발생할 수 있습니다. 테이블의 용량 초과로 프로세스 생성이 불가능할 수 있습니다. 
>> 실체가 없는 좀비 프로세스는 SIGCHLD 시그널을 부모 프로세스에게 보내 좀비 프로세스를 정리하거나 부모프로세스 자체를 종료해야만 해결됩니다. 
 :: SIGCHLD 시그널 -> 고아 프로세스 -> 1번 부모 프로세스 할당 -> 일정 시간 단위로 조회 -> 1번 프로세스가 제거

프로세스 확인

  • ps [옵션] :: 프로세스 확인 명령어입니다.
    • 옵션
-e: 시스템에서 실행 중인 모든 프로세스의 정보를 출력
-u uid : 특정 사용자에 대한 모든 프로세스의 정보를 출력
-p pid : pid로 지정한 특정 프로세스의 정보를 출력
-f : 프로세스에 대한 자세한 정보를 출력

-a : 터미널에서 실행시킨 프로세스의 정보를 출력, -au :: 부모 프로세스 정보도 나옴
-x : 시스템에서 실행 중인 모든 프로세스의 정보를 출력
-u : 프로세스 소유자 이름, CPU 사용량, 메모리 사용량 등 상세 정보를


-pid PID 목록: 목록으로 지정한 특정 PID 정보를 출력

ps -f 결과의 의미


 

특정 프로세스 검색

  • 형식 : pgrep [옵션] [패턴]
  • 옵션
-x : 패턴과 정확히 일치하는 프로세스의 정보를 출력
-u  사용자 이름: 특정 사용자에 대한 모든 프로세스를 출력
-t term: 특정 단말기와 관련된 프로세스의 정보를 출력
-l : PID와 프로세스 이름을 출력
-n : 패턴을 포함하고 있는 가장 최근 프로세스의 정보를 출력

=> 특정 프로세스를 조회할 때 ps 와 grep 를 조합해서 수행했는데 pgrep 는 이 두개를 합쳐놓은 명령어입니다. 

프로세스 종료

  • 형식 : kill [시그널] PID :: 프로세스 종료
  • 형식 : pkill [프로세스이름] :: 프로세스 이름으로 종료
  • 형식 : killall [프로세스이름] :: 프로세스 이름으로 종료
  • 형식 : top [프로세스이름] :: 프로세스 정보를 주기적으로 출력, 서버를 사용할 때 과도하게 cpu 를 사용하는 경우 알림
  • 시그널 :: 프로세스에 무언가 발생했음을 알려주는 간단한 메시지입니다. 
  • kill -l ::리눅스에서 사용가능한 시그널을 확인
SIGHUP(1) :: 터미널과 연결이 끊겼을 때 발생하는 시그널
SIGINT(2) :: 인터럽트(CTRL + c) 발생
SIGQUIT(3) :: 종료 신호인데 사용자가 CTRL + `를 입력하면 발생
SIGKILL(9) :: 프로세스를 강제로 종료시키는 시그널, 우선순위가 가장 높아서 무시할 수 없음
SIGALRM(14) :: 알람에 의해서 발생
SIGTERM(15) :: kill 명령이 보내는 기본 시그널

++ interrupt :: 정상 수행 중에 강제로 중지하는 것인데 인터럽트는 우선 순위가 있어서 현재 수행 중인 작업보다 우선 순위가 높은 경우에만 중지합니다. 

pgrep 을 이용해 정보를 알고 kill 명령 실행

작업제어

포그라운드 작업

>> 터미널에서 작업 ::  명령을 쉘에 입력 -> 쉘이 명령을 해석 -> 커널에 전달해 실행 -> 커널이 실행한 결과를 쉘이 받아서 화면에 출력 -> 사용자는 화면에 출력된 결과를 보면서 대화식으로 작업을 수행합니다. 
>> 포그라운드 프로세스 :: 사용자가 입력한 명령이 실행되서 결과가 출력될 때 기다리는 방식으로 처리되는 프로세스를 
>> 포그라운드 작업은 명령이 수행되는 동안에는 프롬프트가 출력되지 않기 때문에 다른 명령을 입력할 수가 없습니다. 

백그라운드 작업

>> 다른 프로세스가 실행되는 동안에 뒤에서(백그라운드) 다른 프로세스가 실행될 수 있으므로 한 터미널 에서 여러 개의 프로세스        를 동시에 실행 가능합니다. 
>> 프롬프트에서 백그라운드로 프로세스를 실행시키면 작업은 뒤에서 실행되고 프롬프트는 바로 출력됩니다.
>> 작업 + & :: 우분투에서 백그라운드로 작업을 시키는 방법
>> 백그라운드에서 수행시켜야 하는 작업 :: 웹 서버나 데이터베이스 서버처럼 계속해서 구동되어 있어야 하는 프로그램이나 오랜           시간이 걸리는 작업입니다. 
>> 즉각적으로 결과가 나오지 않기에 작업이 수행 중인지 확인하는 것이 좋습니다. 
>> ps -ef | grep sleep

작업 목록 보기

  • 형식 : jobs [%작업번호] :: 모든 백그라운드 작업을 조회하는 명령
  • 결과 : [1]+ Runnig sleep 100
>> 작업번호 : 작업이 늘어날 때마다 1씩 증가
>> + : 가장 최근에 수행된 백그라운드 작업
>> Runnig : 작업 상태
>> sleep 100 : 작업 내용

작업 전환

>> ctrl + z : 포그라운드 작업 중지
>> bg %작업번호 : 작업번호가 지시하는 작업을 백그라운드로 전환
>> fh %작업번호 : 백그라운드 작업을 포그라운드로 전환

계속실행

  • nohup 명령 & :: 일반적으로 로그아웃 후에는 종료 BUT 로그아웃 후에도 실행
  • 크롤링의 경우, 데이터를 수집하는 경우 사용하기 좋습니다.

작업예약

  • cronjob
  • 쿠버네티스의 크론잡 기능
  • Airflow 가 워크플로 관리 프로그램을 이용 :: 작업의 순서를 정하는 플로우
  • 병원에서 예약을 한 경우 전날 같은 시간에 예약 알림이 오는 것
  • 예약 방법
>> 운영체제에서 제공하는 기능 이용
>> 프로그래밍 언어로 프로그램을 만들어서 사용 
>> 응용 프로그램이 제공하는 기능을 이용

정해진 시간에 한번만 실행

  • 형식 : at [옵션] [시각] 작업내용 :: 작업내용은 절대경로로 작성
  • sudo apt install at
  • 옵션
-l : 현재 실행 대기 중인 명령의 전체 목록을 출력
-r 작업 번호 : 현재 실행 대기 중인 명령 중 해당 작업 번호를 삭제
-m : 출력 결과가 없더라도 작업이 완료되면 사용자에게 메일로 알려줌
-f 파일 : 표준 입력 대신 실행할 명령을 파일로 지정

시간 설정

  • 형식 : at 시간
  • ls –l /var/spool/cron/atjobs :: 작업 확인 명령어
  • at –d 작업번호 :: 작업 삭제 명령어
ex) 
at 4pm + 3days: 지금부터 3일 후 오후 4시에 작업을 수행
at 1am tomorrow: 내일 오전 1시에 작업을 수행
at 10:00am today: 오늘 오전 10시에 작업을 수행
at 10am Jul 31: 7월 31일 오전 10시에 작업을 수행
sudo install at

at 10:50 am today
> /usr/bin/ls -l > a.out 
-- 작업 입력 후 ctrl + d 누르기

ls -l /var/spool/cron/atjobs

주기를 가지고 작업을 계속 수행

  • 형식 : crontab [-u 사용자계정] [옵션] [파일 경로]
  • crontab  명령으로 관리하는 파일은 사용자 별로 생성 -> 이 파일에 반복 실행할 작업을 저장합니다. 
  • 주의 :: 여러 명령을 한 파일에 기록 가능 -> 각 명령은 별돌의 행에 작성해야 합니다. 
  • 옵션
-e : 사용자의 crontab 파일을 편집
-r : crontab 파일을 삭제
-l : crontab 파일의 목록을 출력
  • crontab 작성
>> 작업 내용을 제외한 요소에  * 을 작성하면 해당 항목의 모든 값을 의미합니다.
>> - (하이픈) 연산자를 사용하면 범위를 설정할 수 있습니다. ex) 요일 :: 1-5 :: 월요일부터 금요일까지 의미
>> , (콤마) 를 사용하여 여러 개의 값을 지정하는 것이 가능합니다. ex) 요일 :: 1,3,5 :: 월,수,금에만 작업 의미
>> / (슬래시) 를 이용해서 단계 값을 설정하는 것도 가능합니다. ex) 시간 :: */20 :: 20분마다 작업 수행
  • 확인 :: crontab -e -> sudo ls -l /var/spool/cron/crontabs 또는 crontab -l
  • 삭제 :: crontab -r
  • 25 * * * * /usr/bin/ls -l cron.out

crontab 파일의 구성요소

 

ls 작업을 31분에 실행하여 cronls.out 파일에서 확인 가능


systemd service

  • systemd 는 리눅스의 시스템과 서비스 관리로 유닉스의 init 을 대체합니다. 
  • 다양한 서비스 데몬을 시작하고 프로세스들의 상태를 유지하고 시스템 상태를 관리하는 역할을 수행합니다. 
  • init -> systemd 로 변경한 이유
>> shell 과 독립적으로 부팅이 가능합니다.
>> 시스템 상태에 대한 스냅샷을 유지합니다. 
>> 셧다운 전에 사용자 세션의 안전한 종료가 가능합니다.

unit (종류) 

  • 서비스의 종류를 구분하기 위해서 사용하는 개념
  • 서비스명.유닛종류 :: systemd 가 관리하는 관리 대상의 이름
  • 종류
>> service: 시스템 서비스 유닛으로 데몬을 시작, 종료, 재시작 및 로드
>> target: 유닛을 그룹화
>> automount: 디렉토리 계층 구조에서 자동 마운트 포인트를 관리
>> device: 리눅스 장치 트리에 있는 장치를 관리
>> path: 파일 사스템의 파일이나 디렉토리 등 경로를 관리
>> scope: 외부에서 생성된 프로세스를 관리
>> mount: 디렉토리 계층 구조의 마운트 포인트를 관리
>> slice: 시스템의 프로세스를 계층적으로 관리
>> socket: 소켓을 관리하는 유닛으로 AF_INET, AF_INET6, AF_UNIX Socket Stream, Datagram, FIFO 지원
>> swap: 스왑 장치 관리
>> timer: 타이머 와 관련된 기능을 관리
  • 명령
    • 형식: systemctl [옵션] [명령] [유닛명] :: 서비스를 시작하거나 중지하는 명령어, 데몬으로 실행시키는 명령어
    • 유닛 이름은 이름.service 이지만 .service 는 생략 가능합니다. 
    • 옵션
-a : 상태와 관계없이 유닛 전체를 출력
-t 유닛 종류 : 지정한 종류의 유닛만 출력
    • 명령
>> stop: 유닛을 정지
>> reload : 유닛의 설정 파일을 다시 읽어옴
>> restart: 유닛을 재시작
>> status: 유닛 상태를 출력
>> enable: 부팅 시 유닛이 자동으로 시작되도록 설정, 
>> disable: 부팅 시 유닛이 자동으로 시작하지 않도록 설정
>> is-active: 유닛이 동작하고 있는지 확인
>> is-enabled: 유닛이 자동으로 시작되었는지 확인
>> isolate: 지정한 유닛 및 이와 관련된 유닛만 시작하고 나머지는 정지
>> kill :유닛에 시그널을 전송

cgroup 

  • 자원 (CPU, Memory, I/O 등)사용을 프로세스 그룹 단위로 제어할 수 있는 리눅스 커널 기능 
  • 컨테이너의 핵심 기술 - docker 에서 사용
  • 사용법
>> cgroup 이라는 가상 파일 시스템을 수동으로 마운트해서 사용
>> libcgroup 과 같은 툴을 이용하여 그룹을 생성하고 관리
>> cgroup을 이용하는 다른 소프트웨어(ex. Docker, LXC 가상화, libvert 등)를 활용
    •  
      •  
        •  
      •  
반응형
LIST