본문 바로가기

02. Linux & AWS

04. 프로세스 관리

728x90

프로세스

프로세스의 부모-자식 관계

  • 프로세스: 현재 시스템에서 실행 중인 프로그램
  • 하드디스크에 저장된 실행 코드(프로그램)가 메모리에 로딩되어 활성화된 것
  • 모든 프로세스는 부모-자식 관계를 가지고 있음
  • 부모 프로세스는 자식 프로세스를 생성하고, 자식 프로세스는 또 다른 자식 프로세스를 만들 수 있음
  • 자식 프로세스는 할 일이 끝나면 부모 프로세스에 결과를 돌려주고 종료
    • 사용자가 vi를 실행하여 Shell이 vi 프로세스를 생성할 경우
      • → Shell은 부모 프로세스가 되고 vi는 자식 프로세스가 됨
    • 사용자가 vi를 종료하면 다시 부모 프로세스인 Shell로 돌아감

프로세스의 번호

  • PID
    • 각 프로세스는 고유한 번호를 가지고 있음 그 번호를 PID 라고 함
    • PID는 1번부터 시작하고 프로세스가 실행되면서 하나씩 증가하여 부여

프로세스의 종류

  • 포그라운드 프로세스(Foreground Process)
    • 실행하면 화면에 나타나서 사용자와 상호작용을 하는 프로세스
    • 대부분의 응용프로그램
  • 백그라운드 프로세스(Background Process)
    • 실행은 되었지만, 화면에는 나타나지 않고 실행되는 프로세스
    • 백신 프로그램, 서버 데몬 등
  • 데몬 프로세스(Daemon Process)
    • 특정 서비스를 제공하기 위해 존재하며 리눅스 커널에 의해 실행
  • 고아 프로세스(Orphan Process)
    • 자식 프로세스가 아직 실행 중인데 부모 프로세스가 먼저 종료된 자식 프로세스는 고아 프로세스
    • 1번 프로세스가 고아 프로세스의 새로운 부모 프로세스가 되어 고아 프로세스의 작업 종료 지원
  • 좀비 프로세스(Zombie Process)
    • 자식 프로세스가 실행을 종료했는데도 프로세스 테이블 목록에 남아 있는 경우
    • 좀비 프로세스는 프로세스 목록에 defunct 프로세스라고 나오기도 함
    • 좀비 프로세스가 증가하면 포로세스 테이블의 용량이 부족해서 일반 프로세스가 실행되지 않을 수도 있음

프로세스 목록 확인

ps 명령

  • 실행 중인 프로세스의 목록을 보는 명령
  • ps
    • 기능: 현재 실행 중인 프로세스에 대한 정보를 출력
    • 형식: ps [옵션]
    • 옵션
      • <유닉스(SVR4) 옵션>
        • -e : 시스템에서 실행 중인 프로세스의 정보를 출력
        • -f : 프로세스에 대한 자세한 정보를 출력
        • -u ; uid: 특정 사용자에 대한 프로세스의 정보를 출력
        • -p ; pid: pid로 지정한 특정 프로세스의 정보를 출력
          • ※ 유닉스(SVR4) 옵션; 묶어서 사용할 수 있고, 붙임표로 시작 (-ef)
      • <BSD 옵션>
        • a : 터미널에서 실행시킨 프로세스의 정보를 출력
        • u : 프로세스 소유자 이름, CPU 사용량, 메모리 사용량 등 상세 정보를 출력
        • x : 시스템에서 실행 중인 모든 프로세스의 정보를 출력
      • <GNU 옵션>
        • --pid <PID> <목록> : 목록으로 지정한 특정 PID 정보를 출력
    • 사용 예
    ps 
    ps -ef
    ps aux
    
  • 현재 단말기의 프로세스 목록 출력하기: $ ps
    • ps 명령을 옵션 없이 사용하면 현재 Shell이나 터미널에서 실행한 사용자 프로세스의 정보를 출력
      • PID: 프로세스 번호
      • TIME: 해당 프로세스가 사용한 CPU 시간의 양
      • TTY: 현재 터미널 번호
      • CMD: 프로세스가 실행 중인 명령
    $ ps
     PID TTY      TIME CMD
    1280 tty1 00:00:00 bash
    1337 tty1 00:00:00 ps
    
  • 프로세스 상세 정보 출력하기: -f 옵션
    • -f 옵션은 프로세스의 상세한 정보를 출력
    • PPID와 터미널 번호, 시작 시간 등의 정보가 추가로 출력
    항목 의미
    UID 프로세스를 실행한 사용자 ID
    PID 프로세스 번호
    PPID 부모 프로세스 번호
    C CPU 사용량(% 값)
    STIME 프로세스의 시작 날짜나 시간
    TTY 프로세스가 실행된 터미널의 종류와 번호
    TIME 프로세스 실행 시간
    CMD 실행되고 있는 프로그램 이름(명령)
  • 터미널에서 실행시킨 프로세스 정보 출력하기: a 옵션
    • a 옵션은 터미널에서 실행시킨 프로세스의 정보를 출력
      • 출력 내용 중 STAT는 프로세스의 상태를 나타냄
      문자 의미 비고
      R 실행 중(Running)  
      S 인터럽트가 가능한 대기(sleep) 상태  
      T 작업 제어에 의해 정지된(stopped) 상태  
      Z 좀비 프로세스(defunct)  
      STIME 프로세스의 시작 날짜나 시간  
      s 세션 리더 프로세스 BSD 형식
      + 포그라운드 프로세스 그룹 BSD 형식
      l(소문자 L) 멀티스레드 BSD 형식
  • 터미널에서 실행시킨 프로세스 상세 정보 출력하기: a 옵션과 u 옵션
    • a 옵션과 u 옵션을 함께 사용하면 터미널에서 실행한 프로세스의 상세 정보를 출력
    • 단순히 a 옵션이나 -f 옵션을 사용한 것과 비교해보면 CPU와 메모리 사용량 등 추가적인 정보가 출력
    항목 의미
    USER 사용자 계정 이름
    %CPU 퍼센트로 표시한 CPU 사용량
    %MEM 퍼센트로 표시한 물리적 메모리 사용량
    VSZ 사용 중인 가상 메모리의 크기(KB)
    RSS 사용 중인 물리적 메모리의 크기(KB)
    START 프로세스 시작 시간
  • 전체 프로세스 목록 출력하기(UNIX 옵션): -e 옵션과 -f 옵션
    • 전체 프로세스의 더 자세한 정보를 확인하려면 -e 옵션과 -f 옵션을 함께 사용해야 함
    • 두 옵션을 함께 사용할 때는 -ef를 입력
  • 전체 프로세스 목록 출력하기(BSD 옵션): ax 옵션과 aux 옵션
    • ax 옵션: -e 옵션과 마찬가지로 시스템에서 실행 중인 모든 프로세스를 출력
    • aux 옵션: -ef 옵션처럼 시스템에서 실행 중인 모든 프로세스에 대한 자세한 정보를 출력
  • 특정 사용자의 프로세스 목록 출력하기: -u
    • -u 옵션: 사용하면 특정 사용자가 실행한 프로세스의 목록을 확인할 수 있음
    • 더욱 상세한 정보를 보고 싶으면 -f 옵션을 함께 사용, 이 경우 -u 옵션이 -f 뒤에 와야 함
      • ※ -u 옵션 바로 뒤에 -u Option’s argument(인자)가 와야 uid 인식 가능
  • 특정 프로세스 정보 출력하기: -p 옵션
    • -p 옵션과 함께 특정 PID를 지정하면 해당 프로세스의 정보를 출력할 수 있음
    • -f 옵션을 함께 사용하는 것이 좋음

특정 프로세스 정보 검색

  • 특정 프로세스 정보 검색: ps
    • ps 명령과 grep 명령을 |(Pipeline)로 연결하여 특정 프로세스에 대한 정보를 검색할 수 있음
    • ‘$ ps -ef | grep’의 형태로 연결해서 사용
      • Ex. $ ps -ef | grep bash
  • 특정 프로세스 정보 검색: pgrep
    • pgrep 명령: ps와 grep을 하나로 통합하여 만든 명령
    • 기본적으로 인자로 지정한 패턴과 일치하는 프로세스를 찾아 PID를 알려줌
    • 옵션의 지정에 따라 검색 내용이 다양
      • pgrep
        • 기능: 지정한 패턴과 일치하는 프로세스의 정보를 출력
        • 형식: pgrep [옵션] [패턴]
        • 옵션
          • -x : 패턴과 정확히 일치하는 프로세스의 정보를 출력
          • -n : 패턴을 포함하고 있는 가장 최근 프로세스의 정보를 출력
          • -u <사용자 이름> : 특정 사용자에 대한 모든 프로세스를 출력
          • -l : PID와 프로세스 이름을 출력
          • -t <term> : 특정 단말기와 관련된 프로세스의 정보를 출력
        • 사용 예
          • $ pgrep bash
    • bash 패턴을 지정하여 검색한 예
      • pgrep의 경우 -l 옵션을 지정해도 단지 PID와 명령 이름만 출력
        • $ pgrep -l bash
      • -x 옵션을 지정하여 패턴과 정확히 일치하는 프로세스의 정보 출력
        • $ pgrep -x bash
      • 더 자세한 정보를 검색하려면 pgrep 명령을 ps 명령과 연결하여 사용
        • $ ps -fp $(pgrep -x bash)
      • -u 옵션으로 사용자명을 지정하여 검색
        • $ ps -fp $(pgrep -u ec2-user bash)

프로세스 종료

시그널

  • 프로세스에 무언가 발생했음을 알리는 간단한 메시지
  • 프로세스를 종료하는 데 kill이나 pkill 명령을 사용 : 시그널을 보내 프로세스를 종료
  • 리눅스에서 지원하는 시그널의 목록은 kill -l 명령으로 알 수 있음
    • $ kill -l

주요 시그널

시그널 번호 기본 처리 의미
SIGHUP 1 종료 터미널과의 연결이 끊어졌을 때 발생한다.
SIGINT 2 종료 인터럽트로 사용자가 [Ctrl] + c를 입력하면 발생한다.
SIGQUIT 3 종료, 코어덤프 종료 신호로 사용자가 [Ctrl] + \을 입력하면 발생한다.
SIGKILL 9 종료 이 시그널을 받은 프로세스는 무시 할 수 없으며 강제로 종료한다.
SIGALRM 14 종료 알람에 의해 발생한다.
SIGTERM 15 종료 kill 명령이 보내는 기본 시그널

kill : 프로세스 종료

  • kill
    • 기능: 지정한 시그널을 프로세스에게 보낸다
    • 형식: kill [-SIG] PID …
    • 시그널
      • 2 : 인터럽트 시그널을 보낸다([Ctrl] + c)
      • 9 : 프로세스를 강제로 종료한다.
      • 15 : 프로세스와 관련된 파일을 정리하고 종료한다. 종료되지 않은 프로세스가 있을 수 있다.
    • 사용 예
    kill 1001
    kill -15 1001
    kill -9 1001
    
    • kill 명령은 인자로 지정한 프로세스에 시그널을 전달
    • 프로세스는 각 시그널을 받았을 때 어떻게 처리할 것인지 동작이 지정되어 있음
    • kill 명령에서 시그널을 지정하지 않을 경우 15번 시그널로 간주
    • 15번 시그널은 일반적으로 프로세스 종료이지만, 시그널을 무시하거나 다른 동작을 하도록 지정되어 있다면 프로세스가 종료되지 않을 수 있음
    • 9번 시그널은 강제 종료이기 때문에 무조건 종료되지만 좀비 프로세스의 경우 9번 시그널을 받아도 종료되지 않을 수 있음

프로세스 관리 도구

top 명령

  • 현재 실행 중인 프로세스에 대한 정보를 주기적으로 출력
  • 프로세스의 자세한 요약 정보를 상단에 출력하고 각 프로세스의 정보를 하단에 출력
항목 의미
PID 프로세스 ID
USER 사용자 계정
PR 우선 순위
NI Nice 값
VIRT 프로세스가 사용하는 가상 메모리의 크기
RES 프로세스가 사용하는 메모리의 크기
SHR 프로세스가 사용하는 공유 메모리의 크기
%CPU 퍼센트로 표시한 CPU 사용량
%MEM 퍼센트로 표시한 메모리 사용량
TIME+ CPU 누적 이용 시간
COMMAND 명령 이름

포그라운드 작업과 백그라운드 작업

포그라운드 작업

  • 포그라운드 프로세스
    • 사용자가 입력한 명령이 실행되어 결과가 출력될 때까지 기다려야 하는 방식으로 처리되는 프로세스
    • 이를 작업 제어에서는 포그라운드 작업이라고 함
  • 일반적으로 사용자가 명령을 실행하는 방식
  • 프롬프트가 출력되지 않아 다른 명령을 입력할 수 없으므로 기다려야 함
    • → 명령이 모두 실행된 후 프롬프트 실행
      • Ex. $ sleep 30

백그라운드 작업

  • 백그라운드 프로세스
    • 명령을 실행하면 명령의 처리가 끝나는 것과 관계없이 곧바로 프롬프트가 출력되어 사용자가 다른 작업을 계속할 수 있음
    • 작업 제어에서는 백그라운드 작업이라고 함
  • 명령의 실행 시간이 많이 걸릴 것으로 예상되거나 명령을 실행한 후 다른 작업을 할 필요가 있을 때 많이 사용
    • Ex. $ sleep 100 &
  • 기존의 작업 화면과 백그라운드 작업 결과가 뒤섞인 채 터미널 화면에 출력될 수 있음
  • 백그라운드로 처리할 때는 다음과 같이 출력과 오류 방향을 전환하고, 실행 결과와 오류 메세지를 파일로 저장하는 방법을 사용하여 문제를 해결
    • find / -name paswwd:
      • / : Root Dir 의미, 시스템의 모든 디렉터리 대상으로 검색
      • -name <string> : 이름이 ‘string’인 파일을 찾아라
      • 즉, 시스템 전체에서 ‘passwd’라는 이름을 가진 파일을 찾는다.
      • find : 파일을 검색하는 명령
    $ find / -name passwd > pw.dat 2>&1 &
    

작업 제어

  • 작업 제어는 작업 전환과 작업 일시 중지, 작업 종료를 읨
  • 작업 전환: 포그라운드 작업 → 백그라운드 작업, 백그라운드 작업 → 포그라운드 작업으로 전환
  • 작업 일시 중지: 작업을 잠시 중단
  • 작업 종료: 프로세스를 종료하는 것처럼 작업을 종료

jobs : 작업 목록 보기

    • 기능: 백그라운드 작업을 모두 보여준다. 특정 작업 번호를 지정하면 작업 정보만 보여준다.
    • 형식: $ jobs [%작업번호]
    • %작업번호:
      • %번호 : 해당 번호의 작업 정보를 출력
      • %+ 또는 %% : 작업 순서가 +인 작업 정보를 출력한다.
      • %- : 작업 순서가 -인 작업 정보를 출력
    • 사용 예
      • $ jobs %1
      • $ jobs
항목 출력 예 의미
작업 번호 [1] 작업 번호로서 백그라운드로 실행할 땜다 순차적으로 증가한다([1], [2], [3], …).
작업 순서 + 작업 순서를 표시 + : 가장 최근에 접근한 작업 - : + 작업보다 바로 전에 접근한 작업 공백 : 그 외의 작업
상태 실행 중 작업 상태를 표시 Running : 현재 실행 중 Done : 작업이 정상적으로 종료 Terminated : 작업이 비정상적으로 종료 Stopped : 작업이 잠시 중단
명령 sleep 100 & 백그라운드로 실행 중인 명령

작업 전환하기

명령 기능
[Ctrl] + z 포그라운드 작업을 중지(종료하는 것이 아니라 잠시 중단하는 것이다)
bg %작업 번호 작업 번호가 지시하는 작업을 백그라운드 작업으로 전환
fg %작업 번호 작업 번호가 지시하는 작업을 포그라운드 작업으로 전환

작업 종료하기

  • 포그라운드 작업은 [Ctrl] + c를 입력하면 대부분 종료
  • 백그라운드 작업은 kill 명령으로 강제 종료: PID 또는 %작업 번호

작업 예약

로그아웃 후에도 백그라운드 작업 계속 실행하기

  • nohup 명령 : 로그아웃한 다음에도 작업이 완료될 때까지 백그라운드 작업을 실행해야 할 경우에 사용
    • nohup
      • 기능: 로그아웃한 후에도 백그라운드 작업을 계속 실행
      • 형식: $ nohup 명령 &
      • 실행 시, log 파일: nohup.out
        • 날짜 별로 파일이 만들어지고 백업 파일도 설정 가능하다.
        • Ex. nohup 실행 시, log 파일(nohup.out) 생성하지 않기
          • $ nohup <command> 1>/dev/null 2>%&1 &
  • 지정한 파일에 결과와 오류 메시지를 출력
  • 다시 로그인하여 파일 내용 살펴보기

정해진 시간에 실행

  • 특정한 시간에 작업을 실행하도록 예약할 수 있는 두 가지 방법
    • 정해진 시간에 한 번만 수행 Ex. at Command
    • 정해진 시간에 반복 수행 Ex. crontab Command(AWS에서 막혀 있음!~AutoScaling Scheduling이 crontab이기에)
  • at 명령 : 정해진 시간에 한 번만 명령을 실행할 때 사용
    • 기능: 예약한 명령을 정해진 시간에 실행
    • 형식: at [옵션] [시간]
    • 옵션
      • -l : 현재 실행 대기 중인 명령의 전체 목록을 출력(atq 명령과 동일)
      • -r <작업 번호> : 현재 실행 대기 중인 명령 중 해당 작업 번호를 삭제한다(atrm과 동일)
      • -m : 출력 결과가 없더라도 작업이 완료되면 사용자에게 메일로 알려준다
      • -f <파일> : 표준 입력 대신 실행할 명령을 파일로 지정
    • 사용 예
      • $ at 10:00 pm
      • $ at 8:15 am May 30
      • $ at -m 0730 tommorow
  • at 명령을 사용하여 정해진 시간에 명령을 실행하도록 예약하려면 at 명령 뒤에 시간을 명시
    • 시간을 지정하는 형식
      • at 4pm + 3 days : 지금부터 3일 후 오후 4시에 작업을 수행
      • at 10am Jul 31 : 7월 31일 오전 10시에 작업을 수행
      • at 1am tomorrow : 내일 오전 1시에 작업을 수행
      • at 10:00am today : 오늘 오전 10시에 작업을 수행
    • at로 실행할 명령은 기본적으로 표준 입력으로 지정: 명령의 입력을 마치려면 [Ctrl] + d 입력
  • at 작업 파일 확인하기
    • at로 생성된 작업 파일은 /var/spool/at 디렉터리에 저장
      • $ sudo ls -l /var/spool/at
        • ※ root 사용자만 /var/spool/at 디렉터리 내용 확인 가능
  • at 작업 목록 확인하기: -l 옵션, atq 명령
    • at 명령으로 설정된 작업의 목록은 -l 옵션으로 확인
    • 출력 형식: 각 작업 당 한 줄로 작업 번호, 날짜, 시간, 작업 구분 순
      • $ at -l
    • -l 옵션 외에 atq 명령도 실행 대기 중인 작업의 목록을 출력
      • atq
        • 기능: 현재 사용자의 등록된 작업 목록을 보여준다. 슈퍼 유저일 경우 모든 사용자의 작업 목록을 보여준다
        • 형식: $ atq
          • ※ at -l과 같은 형식으로 출력됨
  • at 작업 삭제하기: -d 옵션과 atrm 명령
    • at 명령으로 설정한 작업이 실행되기 전에 삭제하려면 -d 옵션을 사용하고 삭제할 작업 번호를 지정
    • atrm은 at -d와 같은 기능을 수행
      • atrm
        • 기능: 지정된 작업 번호의 작업을 삭제
        • 형식: $ atrm <작업 번호>

정해진 시간에 반복 실행

  • crontab 명령: 지정 시간이 되면 반복적으로 실행하도록 설정
    • crontab
      • 기능: 사용자의 crontab 파일을 관리
      • 형식: crontab [-u 사용자ID] [옵션] [파일명]
      • 옵션
        • -e : 사용자의 crontab 파일을 편집
        • -l : crontab 파일의 목록을 출력
        • -r : crontab 파일을 삭제
      • 사용 예
        • $ crontab -u user1 -e
        • $ crontab -r
        • $ crontab -l
  • crontab 파일 형식
    • Ex. 30 23 1 * * /usr/bin/ls -l ~user1 > ~user/cron.out
      • ← 4번째인 월 항목은 매월을, 5번째인 요일 항목은 모든 요일을 의미
분(0~59) 시(0~23) 일(1~31) 월(1~12) 요일(0~6) 작업 내용
  • crontab 파일 생성하고 편집하기 : crontab -e
    • crontab 파일의 생성과 편집은 crontab -e 명령으로 수행
    • crontab -e 명령으로 수행할 작업을 하나 작성
      • Ex. $ crontab -e
    • crontab -e 명령으로 편집한 파일을 저장하면 자동으로 /var/spool/cron 디렉터리에 사용자 이름으로 생성
      • Ex.
        • $ sudo su -
        • # ls -l /var/spool/cron/
        • # cat /var/spool/cron/<userID>
  • crontab 파일 내용 확인하기: crontab -l
    • $ crontab -l
  • crontab 실행: systemctl start crond
    • $ sudo systemctl start crond
    • $ sudo systecmtl status crond # crond 데몬 상태 확인
  • crontab 파일 삭제: crontab -r
    • $ crontab -r
    • $ crontab -r
    • $ corntab -l
728x90

'02. Linux & AWS' 카테고리의 다른 글

06. FTP  (0) 2024.10.27
05. 소프트웨어 관리  (2) 2024.10.27
03. 링크 & 셸  (0) 2024.10.20
02. AWS EC2 설정, Linux 기본 명령어, 사용자&그룹  (0) 2024.10.20
Linux 개요  (0) 2024.10.20