1. 명령행 인터페이스(3) - 프로세스 관리하기

프라이마리모·2025년 11월 29일
post-thumbnail

프로세스 관리 명령

명령설명
ps프로세스 목록 조회
top프로세스 상태, 시스템 자원 정보 실시간 조회
lsof프로세스가 사용중인 파일 목록 조회
jobs작업 목록 조회
bg, fg프로세스를 백그라운드 또는 포그라운드에서 실행
kill프로세스에 신호를 보내 상태 변경

사용자가 저장 장치에 있는 프로그램을 실행하면 프로그램이 프로세스 상태로 메모리에 적재된다. 프로세스는 계층적으로 구성되며, 프로세스마다 자기 자신을 만들어 준 부모 프로세스가 존재한다. 부모 프로세스로 생성된 자식 프로세스는 부모 프로세스의 속성을 상속받는다. 부팅 과정 중 리눅스 커널이 시작하는 init는 유일하게 부모 프로세스가 없는 1번, 시스템 초기화 프로세스이다.

  • PID (Process ID) : 프로세스 식별번호. 프로세스가 시작할 때 할당받는다.
  • UID (User ID) : 프로세스를 소유하는 사용자 계정을 식별하는 번호. 프로세스에 대한 사용자 권한을 알 수 있다.
  • PPID (Parent PID) : 부모 프로세스의 ID

ps, top : 프로세스 목록 조회

ps 명령어 옵션 목록

옵션설명
-a다른 사용자의 프로세스 상태도 표시
-x화면에 보이지 않는 프로세스까지 표시
-u프로세스를 사용한 사용자와 실행시간 표시
-ax현재 실행 중인 모든 프로세스 표시
-aux프로세스의 시스템 자원 사용률 표시
-e실행 중인 모든 프로세스를 대상으로 프로세스 목록 출력
-f완전한 형식으로 프로세스 목록 출력
-efPID로 정렬되어 있는 프로세스 목록 출력
f프로세스 사이 상속 관계를 시각적으로 표현. -f 옵션과 다르다.
  • ps 명령만 입력(옵션 미사용) : 현재 로그인 한 사용자가 실행하는 프로세스만 표시

  • ps -ax : 현재 실행중인 모든 프로세스 조회. 이 때, 프로세스 목록 중 대괄호로 둘러싸인 프로세스는 커널이 생성한 프로세스이다.

  • ps -aux : 프로세스의 시스템 자원 사용률

    • user : 프로세스 소유자 이름
    • PID : 프로세스 식별 번호
    • %CPU : 프로세스가 CPU를 차지하는 비율
    • %MEM : 프로세스가 메모리를 점유하는 비율
    • VSZ (Virtual Set siZe) : 리눅스가 프로세스에 할당한 가상 메모리 크기(실제 프로세스가 할당한 가상 메모리를 모두 사용하지는 않음)
    • RSS (Resident Set Size) : 프로세스가 현재 사용하는 메모리 크기(프로세스 사이에 공유되는 메모리 정보는 제외)
    • STAT : 프로세스의 현재 상태
    • START : 프로세스가 시작된 시간
    • TIME : 프로세스의 총 사용 시간
    • COMMAND : 프로세스를 실행한 명령

프로세스 상태 값

표기상태
R (Run/Runnable)CPU를 사용하는 상태 / 대기하는 상태
D (in Disk wait)입출력이 완료될 때 까지 대기. 깨울 수 없는 수면 상태. 입출력 완료 시 다시 실행 대기(R)로 전환
S (Sleeping)스스로 대기 중인 수면 상태. 시간이 경과하거나 특정 이벤트가 발생하면 다시 실행 대기(R)로 전환
T (sTopped)외부 신호로 일시 정지된 상태. 또 다른 외부 신호를 수신하면 다시 실행 대기로 전환.
Z (Zombie)실행 완료한 프로세스는 부모 프로세스에 종료 신호를 보내고, 부모 프로세스에서 종료 신호를 받아들이면 프로세스가 소멸된다. 이 때 부모 프로세스에 문제가 있어 신호를 수신하지 못하면 좀비 상태로 남아있게 된다.
  • ps -ef : PID로 정렬되어 있는 프로세스 목록 출력

    • PPID : 부모 프로세스의 PID
    • C : 프로세스의 CPU 점유 상태
    • STIME : 프로세스가 시작된 시간
    • TTY : 프로세스가 시작되고 있는 터미널
    • 그 외 항목은 -aux 옵션과 동일하다.
  • ps -f : 프로세스 목록 상세 조회.

    현재 실행 중인 배시 셸과 셸에서 실행시킨 ps 명령 사이의 관계를 확인할 수 있다.
    ps명령의 PPID가 배시 셸의 PID와 동일하므로 ps는 배시 셸의 자식 프로세스이다. 따라서 명령 행에서 입력하여 실행하는 명령은 배시 셸의 자식 프로세스라는 사실을 알 수 있다.

  • ps f : 프로세스 사이의 상속 관계 표시. 여러 프로세스 사이의 관계를 한눈에 파악하는데 도움이 된다.

top : 실시간 메모리 점유율, CPU 사용률 확인

실시간 메모리 점유율, CPU 사용률 확인에는 ps -aux보다 top이 더 유용하다. ps는 개별 프로세스 상태를 보여주지만, top은 전체적인 프로세스를 알아볼 때 사용한다.

  • 윗부분은 시스템 가동 시간, 평균 부하, 전체 프로세스 정보, 메모리 정보 등 시스템 상태를 요약하여 보여준다.
  • 아래는 각 프로세스 정보를 CPU를 가장 많이 점유하는 순서대로 출력한다.
    • 약 5초마다 내용이 업데이트 되며, Space 또는 Enter키를 누르면 프로세스 목록이 바로 갱신된다.
    • 필요 시 단축키를 통해 프로세스 목록을 다양한 순서로 정렬할 수 있다.
      • Shift + p : CPU 사용량(%CPU) 순
      • Shift + m : 메모리 사용량(%MEM) 순
      • Shift + n : PID 순
      • Shift + t : CPU 사용 시간별(TIME+)
      • < 또는 > : 정렬 순서 결정
      • q : top 종료
    • PID : 프로세스ID
    • USER : 프로세스 소유자
    • PR : 프로세스의 우선순위
    • NI : 우선순위를 지정하는 nice값
    • VIRT : 프로세스가 점유하는 가상 메모리 양(KB)
    • RES : 스왑되지 않은 물리 메모리양(KB)
    • SHR : 공유 메모리양(KB)
    • S : 프로세스 상태
    • %CPU : CPU 점유율
    • %MEM : 메모리 점유율
    • TIME+ : 프로세스가 CPU를 사용한 누적 시간
    • COMMAND : 프로세스를 실행한 명령

lsof : 열린 파일 목록 조회

리눅스 커널은 파일을 파일 기술자라는 숫자 값으로 구분한다. 리눅스는 모든 것을 파일로 추상화해서 다루기 때문에 일반 파일뿐만 아니라 입출력 장치, 네트워크 소켓, 파이프 같은 실행 중인 프로세스와 관련 된 시스템 장치를 파일 기술자로 관리한다.
이중 0은 표준 입력, 1은 표준 출력, 2는 표준 오류로 예약되어있다.

  • lsof : 열린 파일 목록을 화면에 표시. 사용자 명령 또는 시스템 프로세스로 사용중인 파일 목록 조회. 이 때 일부 파일은 로그인 해 있는 사용자 권한으로 조회할 수 없어 표시되지 않지만, sudo명령을 붙이면 루트 권한으로 시스템 파일까지 확인할 수 있다.

    • 필드 목록
      • COMMAND : 실행한 명령
      • PID : 프로세스 식별 번호
      • USER : 사용자
      • FD : 파일 기술자. 숫자 외에 cwd(현재 작업 디렉터리), rtd(루트 디렉터리), txt(텍스트 파일), mem(메모리 매핑 파일)으로 표시
      • TYPE : 파일 종류. DIR(디렉터리), REG(일반파일), CHR(문자 장치 파일), FIFO(파이프나 소켓), IPv4(네트워크 연결)로 표시
      • DEVICE : 장치 번호
      • SIZE/OFF : 파일 크기
      • NODE : 노드 번호
      • NAME : 파일 이름
  • lsof -i : 네트워크 연결 정보 조회. 연결 정보는 NAME 필드에서 확인할 수 있으며, 연결된 상태의 TCP정보는 [호스트명]:[포트번호]->[원격호스트명]:[포트번호] 형식으로 표기된다.

    -i 옵션 뒤에 프로토콜과 포트 번호를 명시하여 결과를 필터링 할 수 있다. 예를 들어 lsof -i TCP:80은 네트워크 연결 중 TCP 80번 포트(http)와 연결 정보만 보여준다.

  • lsof -u [사용자명] : 사용자 소유의 열린 파일 목록 조회

  • lsof -c [명령] : 특정 명령으로 사용되는 파일 목록 조회

  • lsof -p [PID] : 프로세스가 사용하는 파일 목록 조회. 시스템 파일 조회 시 루트 권한이 필요하다.


작업 제어하기

여러 작업을 동시에 처리하는 데 작업 제어 명령을 사용한다.

프로세스를 하나 실행시켰다가 중지시키며 작업을 제어해보자.

  • wget [옵션] [url링크]은 네트워크를 사용하여 파일을 받아오는 명령이다.
  • 우분투 서버 iso 이미지를 내려받는 중에 ctrl + z를 눌러 작업을 중단한다.
  • 하단 [1]은 작업을 제어하는 작업ID(job ID)이다.

jobs : 목록을 화면에 표시하는 작업 제어 명령

  • jobs -l : 해당 프로세스의 PID를 함께 출력

bg [작업ID] 또는 & 추가: 중단된 프로세스를 백그라운드에서 실행

PID와 달리 작업ID는 퍼센트(%)를 붙여서 구분한다. 아까 중지시킨 wget 명령을 백그라운드에서 실행한 후 jobs로 확인해보면 작업이 진행중인 상태로 변경됨을 볼 수 있다.

fg [작업ID] : 백그라운드에서 진행중인 작업을 다시 포그라운드로 실행

작업을 포그라운드로 가져오면 작업이 끝날때까지 대기하거나 ctrl + c로 작업을 강제 종료할 수 밖에 없다.

sleep [시간] : 지정한 시간만큼 대기

백그라운드에서 실행되는 작업을 대기 시키려면 &를 붙이면 된다.
ex) sleep 30& : 30초 대기

언제든 jobs -l 명령으로 진행 중인 프로세스의 작업ID와 PID를 확인할 수 있다.


kill : 프로세스 상태 변경

kill 명령은 실행 중인 프로세스에 시스템 신호를 보내 프로세스 상태를 변경한다.
신호 종류는 kill -l로 확인할 수 있다.

  • kill [옵션] [PID] 형태로 입력한다.
    아무 옵션이 없으면 15번 SIGTERM 신호를 보내 프로세스를 종료한다.

자주 사용되는 옵션

  • kill -9 [PID] : SIGKILL. 프로세스 강제 종료.
    대부분의 프로세스는 SIGTERM 신호로 종료되지만, 종료되지 않는 경우 SIGKILL을 사용하여 강제 종료시킨다.
  • kill -1 [PID] : SIGHUP. 프로세스를 멈추지 않고 다시 실행
    환경설정을 변경하여 서비스를 다시 실행할 때 사용가능하여 서버를 운영하는데 유용하다.

쉬운 입력을 위한 배시의 명령 히스토리

  • 커서 이동키 를 누르면 이전에 자신이 내렸던 명령을 불러올 수 있다.
  • 명령 행에서 history 명령을 내리면 이전에 자신이 실행했던 명령 목록을 조회할 수 있다.
    • 이전에 실행했던 명령을 검색하고자 history명령 결과를 파이프를 이용해서 grep 명령으로 넘기는 방식을 자주 사용한다.
      ex) history | grep [명령]
  • !!라고 입력하면 바로 전에 실행한 명령을 다시 실행한다.
  • history 명령 결과는 [번호] [명령] 형식이다. ![번호]를 입력하면 번호에 해당하는 명령을 다시 실행한다.

실행중인 작업 목록에서 PID 알아내기

wget 명령을 백그라운드 실행 후 PID를 찾아보자.

  • jobs -l : 백그라운드에서 실행중인 작업목록에서 PID를 알아낼 수 있다.
  • ps -ef | grep wget : ps -ef 결과 중에서 grep으로 문자열 wget을 검색하여 화면에 표시한다.
profile
개발공부 요약노트

0개의 댓글