공부 기록/리눅스 기초

[리눅스 기초] 09 프로세스 관리

도도히히 2025. 11. 3. 10:27

프로세스

프로세스 번호와 작업 번호

  • 프로세스 번호
    • CPU가 프로세스를 구분하기 위해 부여되는 고유 번호
    • 각 프로세스가 가지는 고유의 번호를 PID라고 함
  • 작업 번호 (Job number)
    • 현재 셸에서 실행되는 작업을 구분·제어하기 위해 셸에서 부여하는 식별 번호

 

프로세스 서비스와 관계

  • 데몬 프로세스
    • 우분투에서 특정 서비스를 제공하기 위해 존재하는 프로세스
    • 시스템 백그라운드에서 계속 실행되며 특정 기능이나 서비스를 제공하는 프로세스
  • 부모-자식 관계의 프로세스
    • 부모 프로세스는 PPID를 가지며 자식 프로세스는 PID를 보유

 

고아 프로세스와 좀비 프로세스

  • 고아 프로세스
    • 부모-자식 관계의 프로세스에서 자식 프로세스가 종료되지 않은 상태에서 부모 프로세스가 종료되는 경우
    • 고아 프로세스의 종료는 1번 프로세스를 부모 프로세스로 의존하게 되어 작업을 무난히 마치고 프로세스를 종료하게 됨
  • 좀비 프로세스
    • 부모 프로세스가 자식 프로세스의 종료를 기다린 뒤에 종료를 처리해 주는 정상적인 과정을 거치지 않고 부모 프로세스를 종료할 경우 발생하게 되는 프로세스를 의미 (자식 프로세스가 종료된 상태)
    • 좀비 프로세스는 kill 명령으로 제거할 수 없음 (SIGCHLD 시그널을 부모 프로세스에 보내 부모 프로세스가 자식 프로세스를 정리하도록 수행하거나 부모 프로세스 자체를 종료해야만 좀비 프로세스를 제거할 수 있음)

 

프로세스 관리 명령

 

프로세스 상태 확인: ps 명령

우분투에서 ps 명령의 옵션은 유닉스, BSD, GNU 3가지 유형으로 지원

 

ps [옵션] : 현재 실행 중인 프로세스의 상태 확인

옵션

<유닉스 옵션>

-e : 시스템에서 실행 중인 모든 프로세스의 정보 출력

-f : 프로세스에 대한 상세한 정보 출력

-u UID : 특정 사용자에 대한 모든 프로세스의 정보 출력

-p PID : PID로 지정한 특정 프로세스의 정보 출력

 

<BSD 옵션>

a : 터미널에서 실행한 프로세스의 정보 출력

u : 프로세스 소유자의 이름, CPU와 메모리 사용량 등 상세한 정보 출력

x : 시스템에서 실행 중인 모든 프로세스의 정보 출력

 

<GNU 옵션>

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

 

옵션 한번에 여러 개 사용 가능

 

 

ps : 프로세스 목록 출력 (현재 프로세스 상태 정보)

항목 의미
PID 실행 중인 프로세스를 구별하기 위한 프로세스의 고유 ID
TTY 프로세스가 시작되고 있는 현재 터미널 번호
TIME 해당 프로세스가 현재까지 사용된 CPU의 시간과 양
CMD 프로세스가 실행한 명령이 무엇인지를 알려줌

 

각 터미널마다 PID와 TTY가 다름

 

 

ps -f : 현재 프로세스의 상세한 정보 출력

항목 기능

항목 기능
UID 프로세스를 실행한 사용자 ID
PID 실행 프로세스 번호
PPID 부모 프로세스 번호
C CPU 사용량을 % 값으로 표시
STIME 프로세스 시작 날짜 또는 시각
TTY 터미널의 종류와 번호
TIME 프로세스 실행 시간
CMD 실행되고 있는 프로그램 이름

cf. ps -p PPID (이때 CMD가 bash인 PPID 입력) : CMD가 gnome-terminal임

 

프로세스 관리

  • 특정 프로세스 정보를 검색할 때는 pgrep 명령 사용
  • ps 명령과 grep 명령을 하나로 통합하여 만든 명령어로 인식
  • pgrep 명령은 옵션 다음에 선언한 인자와 일치하는 패턴의 프로세스를 찾아 PID를 알려줌

 

pgrep [옵션] [인자] : 인자와 일치하는 패턴의 프로세스 정보 출력

옵션

-x : 인자와 정확히 일치하는 패턴의 프로세스 정보 출력

-n : 인자를 포함하고 있는 가장 최근의 프로세스 정보 출력

-u 사용자 계정 이름 : 특정 사용자 계정에 대한 모든 프로세스의 정보 출력

-l : PID와 프로세스의 이름 출력

-t term : 특정 단말기와 관련된 프로세스의 정보 출력

 

pgrep -x bash : bash 프로세스의 PID 정보 출력

pgrep -l bash : bash 프로세스의 PID와 프로세스의 이름 출력

ps -fp $(pgrep -x bash) : pgrep -x bash 명령의 실행 결과(PID 목록)을 ps 명령의 -p 옵션에 전달

 

cf. $(pgrep -x bash): command substitution

 

  • kill 명령으로 프로세스 종료
    • 프로세스를 종료하는 kill 명령은 종료할 프로세스에 인자로 지정한 숫자 메시지를 시그널로 보내 해당 프로세스를 종료
    • 프로세스에 보내는 시그널은 인터럽트, 프로세스 종료, 강제 종료 등의 숫자로 기능이 지정되어 있음

 

kill [시그널] PID : 프로세스 종료를 위해 지정한 시그널을 해당 프로세스에 전달

시그널

-2 : 인터럽트 시그널 전송 (Ctrl+C)

-9 : 프로세스 강제 종료

-15 : 프로세스가 관련 파일을 정리 후 종료 (종료되지 않는 프로세스도 존재)

 

  • kill 명령으로 프로세스를 종료하기 위해 2개의 터미널 창 실행

yes > /dev/null : 무한루프 명령 수행

cf. /dev/null : 아무런 반응을 하지 않는 장치 선언, yes: yes 라는 문자열을 화면에 반복해서 출력하라는 의미

Ctrl+C를 누르면 강제 종료됨 (Ctrl+Z는 일시 중단)

 

강제 종료 방법

  1. 새 터미널에서 ps -ef | grep yes 로 PID 확인 → kill -9 PID로 강제 종료
  2. ps -fp $(pgrep -x yes) → kill -9 PID
  • pkill 명령으로 프로세스 종료 (잘 사용하진 X)
    • kill 명령와 같이 시그널을 보내는 방식은 같음
    • PID를 보내는 것이 아니라 프로세스의 명령이름으로 프로세스를 찾아서 종료해 줌 (kill 명령과 차이점)
    • 같은 명령으로 수행한 프로세스를 명령 이름으로 찾아주기 때문에 pkill yes와 같이 한꺼번에 같은 이름의 명령을 찾아서 모두 종료할 수 있다는 편의성 제공

 

문제 10-01

  1. ps 명령과 옵션으로 프로세스의 상세한 정보 출력하기
  2. pgrep 명령으로 bash를 실행하고 있는 프로세스의 PID 출력하기
  3. ps 명령과 옵션으로 터미널에서 실행한 프로세스의 정보 출력하기
$ ps -f
$ pgrep -x bash
$ ps a

 

포그라운드와 백그라운드

 

포그라운드

  • 터미널 창에서 명령어를 입력하면 셸은 사용자가 입력한 명령을 수행하여 그 결과를 화면에 보여줌
  • 사용자는 화면에 나타난 출력결과를 보고 다른 명령을 입력하는 대화식으로 수행하는 작업
  • 즉, 사용자와 상호작용을 하여 작업을 수행하도록 해주는 프로세스를 포그라운드 작업이라 함

백그라운드

  • 프로세스가 실행되었지만 직접 눈으로 프로세스가 확인되지 않는 작업
  • ex) 백신 프로그램, 서버 데몬 등과 같이 화면에 나타나 눈에 보이지는 않지만 실행되는 명령 작업
  • 이때 수행하는 프로세스를 백그라운드 프로세스라 함

sleep 10 : 10초 동안 포그라운드 작업 (작업이 끝날 때까지 기다려야 함)

sleep 30& : 30초 동안 백그라운드 작업 (다른 작업 수행 가능)

 

작업 제어

  • 포그라운드 작업을 백그라운드 작업으로 전환하거나 백그라운드 작업을 포그라운드 작업으로 전환하는 제어를 의미
  • 작업 제어는 작업 전환과 작업의 일시 중지, 작업 종료로 구분되어 수행됨
  • jobs 명령: 현재 실행중인 작업 목록 출력 (멈춰있는 작업도 포함)

jobs [%작업 번호] : 작업 목록 출력

%작업 번호

%번호 : 해당 작업의 정보만 출력

%+ 또는 %% : 작업순서가 +인 작업 정보를 출력

%- : 작업순서가 -인 작업 정보를 출력

 

sleep 20&

sleep 30&

sleep 10

jobs (포그라운드 작업은 목록에 보이지 않음)

 

 

작업 전환

  • 현재 포그라운드로 실행 중인 작업을 백그라운드 작업으로 전환하거나 백그라운드 작업을 포그라운드로 전환

명령 의미

명령 의미
Ctrl+Z 또는 stop [%작업 번호] 포그라운드 작업을 잠시 중단
bg [%작업 번호] 작업 번호가 지시하는 작업을 백그라운드 전환
fg [%작업 번호] 작업 번호가 지시하는 작업을 포그라운드 전환

 

sleep 100

Ctrl+Z 눌러 일시 중단

bg %1 : 백그라운드로 작업 전환

cf. bg 명령만 사용할 경우 작업순서가 +인 작업에 대해서만 적용됨

jobs

→ sleep 100이 sleep 100&로 전환되어 작업 목록에 보이게 됨

 

 

포그라운드 작업 종료 : Ctrl+C (Ctrl+Z는 작업 일시 중지)

  • 포그라운드 작업은 Ctrl+C를 누르면 대부분 종료
  • 또다른 방법은 해당 프로세스의 PID를 찾아서 강제 종료

Ctrl+C를 눌러 현재 수행 중인 포그라운드 작업을 강제로 종료하고 jobs 명령으로 작업 목록을 확인해보면 수행 중인 작업이 없는 것을 알 수 있음

 

백그라운드 작업 종료 : kill

  • kill 명령을 사용하여 강제 종료
  • 인자는 PID 대신 ‘%작업 번호’ 를 선언해도 됨

kill PID 또는 kill %작업 번호

 

 

문제 10-02

  1. 터미널 창에서 gedit 명령 수행하기
  2. 실행 중인 gedit를 정지된 작업으로 만들기
  3. 터미널 창에서 수행 중인 백그라운드 작업 목록 확인하기
  4. 정지 중인 백그라운드 작업을 포그라운드 작업으로 전환하기
  5. 단축키를 사용하여 수행 중인 포그라운드 작업 강제 종료하기
  6. 현재 수행 중인 작업 목록 출력하기
$ gedit 
$ Ctrl+Z 누르기
$ jobs
$ fg %1
$ Ctrl+C 누르기
$ jobs