[리눅스마스터 1급] 이기적 이론서 6회차 정리 - 프로세스 관리

🏁 이기적 이론서 학습 범위

  • PART 01 리눅스 시스템 관리
    • CHAPTER 01 일반 운영 관리 (SECTION 03 프로세스 관리)

☑️ 프로세스 관련 명령어

프로세스 정보

  • ps
    • /proc 디렉터리 이하에 프로세스와 연관된 가상 파일 시스템의 내용을 토대로 프로세스 정보를 출력한다.
      • Unix 스타일은 - 를 사용하지 않는다.
      • BSD 스타일은 - 를 사용한다.
      • GNU 스타일은 -- 를 사용한다.
    • 형식

        ps [options]
      
    • 옵션

      옵션설명
      a모든 사용자가 소유한 프로세스를 출력한다. (기본: 현재 사용자 프로세스만 출력)
      x터미널에 연관되지 않은 프로세스도 출력한다. (기본: 터미널과 연관된 프로세스만 출력)
      -A모든 프로세스를 출력한다.
      -e모든 프로세스를 출력한다.
      -a세션 리더와 터미널과 연관되지 않은 프로세스를 제외하고 모든 프로세스를 출력한다.
    • 옵션: 지정한 프로세스 출력

      옵션설명
      p지정한 Process ID 목록 정보만 출력한다.
      -C- 지정한 프로세스의 실행 파일 이름의 정보만 출력한다. - 다수 입력이 가능하다.
      -u- 특정 사용자의 프로세스 정보를 출력한다.
      - 다수 입력이 가능하다.
    • 옵션: 프로세스 표시 형식

      옵션설명
      u프로세스의 소유자 정보를 함께 출력한다.
      l- BSD 형식의 긴 형식으로 출력한다.
      - F, UID, PID, PPID, PRI, NI, VSZ, RSS, WCHAN, STAT, TTY, TIME, CMD 순으로 출력한다.
      e프로세스 정보와 함께 프로세스의 한경변수도 출력한다.
      -l긴 포맷으로 출력한다.
      -o사용자 정의 형식 지정이 가능하다.
    • 옵션: 프로세스 장식

      옵션설명
      f프로세스 계층의 텍스트 형식의 트리 구조로 보여준다.
      -f- 전체 포맷으로 출력한다.
      - 유닉스 스타일 옵션과 함께 사용하여 컬럼을 추가할 수 있다.
    • 예제

        $ ps # 현재 셸과 관련된 프로세스 출력
              
        $ ps -A # 현재 실행중인 모든 프로세스 출력
        OR
        $ ps -e
              
        $ ps -ef # 현재 실행 중인 모든 프로세스의 정보를 전체 포맷으로 출력
              
        $ ps -elf # 현재 실행 중인 모든 프로세스의 정보를 전체 포맷보다 더 많은 정보로 출력
              
        $ ps aux # 터미널에 연관되지 않은 프로세스를 포함한 모든 사용자의 프로세스를 소유자 정보와 함께  프로세스 정보를 출력
              
        # PID가 2861인 프로세스의 소유자와 프로세스 이름 출력, 프로세스 이름의 헤더는 출력하지 않음
        $ ps -p 2861 -o user -o comm= 
              
      
    • ps 명령어 주요 항목 및 상태 코드는 많아서 생략
  • pstree
    • 프로세스를 트리 형태로 출력한다.
    • 형식

        pstree [options]
      
    • 옵션

      옵션설명
      -a프로세스의 명령줄 인자를 출력한다.
      -h현재 프로세스와 부모 프로세스를 강조 표시한다.
      -n프로세스 이름 대신 PID순으로 정렬하여 출력한다.
      -pPID를 함께 출력한다.
      -s특정 프로세스의 부모 프로세스를 출력한다.
    • 예제

        $ pstree -h # 모든 프로세스를 트리 형식으로 출력, 현재 프로세스와 부모 프로세스는 강조 표시
      
  • top
    • 현재 실행 중인 프로세스에 대한 정보를 실시간으로 제공한다.
    • 형식

        top [options]
      
    • 옵션

      옵션설명
      -n지정한 숫자만큼 화면 출력을 갱신한 후 명령을 자동 종료한다.
      -u지정한 사용자의 프로세스를 모니터링한다.
      -b출력 결과를 파일이나 다른 프로그램으로 전달한다.
      -d화면 갱신 주기를 초 단위로 설정한다.
      -p지정한 PID의 프로세스를 모니터링 한다.
    • 예제

        $ top -u francis # francis 사용자의 프로세스 모니터링
              
        $ top -p 2394 -d 1 # PID 2394의 정보를 1초 단위로 갱신하여 보여줌
      
    • top의 주요항목 및 실행화면 단축 명령어 생략

프로세스 종료

  • kill
    • 프로세스에게 특정 시그널을 보낸다.
    • 시그널을 지정하지 않으면 기본 값으로 프로세스 종료를 위한 TERM 시그널을 보낸다.
    • 형식

        kill [option] [pid]
      
    • 옵션

      옵션설명
      -signal, -s signal지정한 시그널을 보낸다.
      -l사용 가능한 시그널 목록을 출력한다.
    • 예제

        $ kill -9 -1 # PID가 1인 프로세스를 제외하고 모든 프로세스를 강제종료
              
        $ kill -l # 사용가능한 시그널 목록을 테이블로 표시
              
        $ kill 123 2345 # 프로세스 123과 2345에게 기본 시그널을 전송
              
        # 프로세스 5555에게 SIGKILL 전송
        $ kill -9 5555 
        OR
        $ kill -s 9 5555
        OR
        $ kill -s SIGKILL 5555
        OR
        $ kill -s KILL 5555
        OR
        $ kill -KILL 5555
        OR
        $ kill -SIGKILL 5555
      
  • killall
    • 지정한 이름에 부합하는 모든 프로세스에게 시그널을 보낸다.
    • 시그널을 지정하지 않으면 SIGTERM이 전송된다.
    • 지정한 프로세스 이름에 매칭되는 프로세스는 모두 종료된다.
    • 형식

        killall [options] processname
      
    • 옵션

      옵션설명
      -I, —ignore-case대소문자 구분을 무시한다.
      -g, —process-group프로세스가 속한 그룹의 프로세스에게 모두 시그널을 보낸다.
      -l, —list사용할 수 있는 모든 시그널 목록을 표시한다.
      -s, —signalSIGTERM 대신 보낼 시그널을 지정한다.
      -u, —user지정한 사용자의 모든 프로세스에게 시그널을 보낸다.
      -v, —verbose시그널이 성공적으로 보내졌는지 표시한다.
      -w, —wait모든 프로세스가 종료될 때까지 기다린다.
      -i프로세스 종료 전 사용자에게 물어본다.
    • 예제

        $ killall Not_Response_Daemon # 지정한 이름의 모든 프로세스 종료
              
        $ killall -I Not_Response_Daemon # 지정한 이름의 모든 프로세스를 종료 (대소문자 구분X)
              
        $ killall -9 -i bash # 프로세스 이름이 bash인 프로세스에게 SIGKILL 전송. 보내기 전 사용자에게 확인
      
  • pkill
    • 프로세스 이름과 지정한 패턴이 부합하는 프로세스만 종료한다.
    • 형식

        $ pkill [options] pattern
      
    • 옵션

      옵션설명
      -signal, —signal signal보낼 시그널을 지정한다.
      -g, —pgroup pgrp…지정한 그룹의 프로세스 중 패턴이 매칭되는 프로세스에게 시그널을 보낸다.
      -G, —group gid..지정한 리얼 그룹 ID의 프로세스 중 패턴이 매칭되는 프로세스에게 시그널을 보낸다.
      -t, —terminal term…특정 터미널과 연관된 프로세스 중 패턴이 매칭되는 프로세스에게 시그널을 보낸다.
      -u, —euid euid…특정 이펙티브 사용자 ID의 프로세스 중 패턴이 매칭되는 프로세스에게 시그널을 보낸다.
      -U, —uid uid…특정 리얼 사용자 ID의 프로세스 중 패턴이 매칭되는 프로세스에게 시그널을 보낸다.
    • 예제

        $ pkill -HUP syslogd # 패턴이 syslogd와 프로세스 이름이 매칭되는 프로세스에게 HUP 시그널 전송
      

프로세스 전환

  • jobs
    • 현재 실행 중인 모든 jobs의 목록을 출력한다.
    • 형식

        jobs [options] [job name or number]
      
    • 옵션

      옵션설명
      -lPID 정보를 추가로 표시한다.
      -pPID만 표시한다.
    • 예제

        $ jobs # 모든 jobs의 목록 출력
              
        $ jobs -l # PID 정보를 추가하여 모든 잡 목록 출력
      
  • fg
    • 백그라운드에 멈춰있던 잡을 포어그라운드로 보내 셸 프롬프트상에서 다시 실행한다.
    • 형식

        $ fg
      
    • 예제

        $ fg # 가장 최근의 잡을 포어그라운드로 전환
              
        $ fg %3 # 잡 번호가 3인 잡을 포어그라운드로 전환
        OR
        $ fg 3
      
  • bg
    • 포어그라운드의 잡을 백그라운드로 전환한다.
    • 형식

        bg [job]
      
    • 옵션

      옵션설명
      job- 백그라운드에서 실행하고 싶은 잡을 지정한다.
      - 잡 번호가 1이라면 %1로 기재하고, 2라면 %2로 기재한다.
      - 현재 잡은 %, %+, %% 중 하나를 사용하고 이전 잡은 %-, - 중 하나를 사용한다.
    • 예제

        $ bg %3 # 잡 번호가 3인 잡을 백그라운드로 실행
      

프로세스 우선순위

  • nice
    • 프로세스의 우선순위를 의미하는 nice 값을 설정한다.
    • 기본적으로 사용자 프로세스 사이에서 우선순위를 조정할 수 있고, 프로세스의 스케줄링에 영향을 줄 수 있다.
    • top 명령어 등으로 프로세스의 정보를 보면 NI 필드로 표현이 된다.
    • nice 값은 높은 우선순위를 뜻하는 -20에서 낮은 우선순위를 뜻하는 19 범위 안에서 설정할 수 있고, 기본값은 0이다.
    • nice 값이 낮으면 많은 CPU 시간이 할당되고, 높으면 적은 CPU 시간이 할당된다.
    • 형식

        nice [options] [command arg]
      
    • 옵션

      옵션설명
      -n, —adjustment- nice 값을 기존의 값에 더한다.
      - 값을 지정하지 않으면 기본값 10을 더한다.
    • 예제

        $ nice # 프로세스가 생성될 때 기본 nice 값을 출력한다. 
              
        # myfile.txt 인자를 넘기면서 nano 프로세스를 실행한다.
        # 기존의 nice 값에 13을 증가한다.
        # nice 값 변경 시 PRI 값도 변경된다. PRI는 기존의 PRI 값에 NI값이 더해진 값이다.
        $ nice -n13 nano myfile.txt
        OR
        $ nice -13 nano myfile.txt
              
        $ nice --10 bash # bash의 nice 값을 10 감소
      
  • renice
    • 현재 실행 중인 프로세스의 nice 값을 바꾼다.
      • nice 는 새롭게 실행하는 프로세스를 대상으로 nice 값을 지정한다.
    • 기존 값과 관계 없이 설정한 값으로 반영한다.
      • nice 는 현재 nice 값 기준으로 증가, 감소하는 식으로 설정한다.
    • 형식

        renice [-n] priority [option]
      
    • 옵션

      옵션설명
      -n, —prioritynice 값을 지정한다.
      -g, —pgrp지정한 프로세스 그룹에게 설정한다.
      -u, —user지정한 사용자에게 설정한다.
      -p, —pid지정한 PID에게 설정한다.
    • 예제

        # PID 987과 32인 프로세스와 daemon 사용자와 root 사용자의 프로세스의 nice 값을 13으로 설정
        $ renice 13 987 -u daemon root -p 32
      
  • nohup
    • 일반적으로 시스템에서 로그아웃 시 로그아웃한 세션과 연관된 모든 프로세스에게 HUP 시그널을 보내기 때문에 관련된 모든 프로세스는 자동 종료된다.
    • 하지만 nohup 사용시 해당 시그널을 가로채 무시하기 때문에 로그아웃하더라도 프로세스를 계속 실행할 수 있다.
    • 형식

        nohup command
      
    • 예제

        # google.com 호스트에 5번 ping을 보냄 (&를 쓰지 않아서 ping 명령이 끝나면 프롬프트로 복귀)
        $ nohup ping -c 5 google.com 
              
        # &를 사용해 google.com 호스트에 5번 ping을 보냄 (ping은 백그라운드에서 실행됨)
        # 터미널이 종료되더라도 실행은 유지된다.
        $ nohup ping -c 5 google.com & 
      

프로세스 검색

  • pgrep
    • 프로세스 이름 전체 또는 일부가 매칭되거나 특정 프로세스 속성을 기반으로 현재 실행 중인 프로세스를 검색한다.
    • 형식

        pgrep [options] [pattern]
      
    • 옵션

      옵션설명
      -x패턴과 정확히 일치하는 프로세스의 PID를 출력한다.
      -g, -pgroup지정한 프로세스 그룹 ID를 갖는 프로세스의 PID를 출력한다.
      -G, —group지정한 프로세스 리얼 그룹 ID를 갖는 프로세스의 PID를 출력한다.
      -u, —euid이펙티브 사용자 ID와 매칭하는 프로세스의 PID를 출력한다.
      -U, —uid리얼 사용자 ID와 매칭하는 프로세스의 PID를 출력한다.
      -t, —terminal지정한 터미널과 관련된 프로세스의 PID를 출력한다.
    • 예제

        $ pgrep -u root crond # root 사용자 중 프로세스명이 crond와 전체 혹은 일부 매칭하는 프로세스의 PID 출력
              
        $ pgrep -x -u root cron # 사용자가 root이고 cron과 정확히 일치하는 프로세스의 PID 출력.
              
        $ pgrep -t -tty1 # tty1 터미널 관련된 프로세스의 PID 출력
      

☑️ 프로세스 관련 파일

/proc 디렉터리

  • 설명
    • 커널 내의 다양한 정보를 포함한다.
    • 디스크상 존재하는 실제 디렉터리는 아니고, procfs라는 가상 파일 시스템이다.
    • ls, cat과 같은 파일 접근 명령어를 통해 프로세스, CPU, 장치, 파일 시스템 등 시스템의 정보를 조회할 수 있다.
    • 시스템이 부팅할 때 자동으로 procfs/proc에 마운트된다.
    • 터미널에서 직접 마운트할 수 있다.

        $ mount -t proc proc /proc
      
  • 프로세스 정보
    • /proc/PID : 각 프로세스는 고유 식별자인 PID를 가지며, /proc/PID 디렉터리 이하에 프로세스의 정보를 갖는다.
    • /proc/self : /proc 디렉터리에 접근하고 있는 현재 프로세스 정보를 확인한다.

        $ ls -l /proc/self # /proc/self가 PID가 3054인 프로세스 경로로 링크되었음을 확인
        lrwxrwxrwx. 1 root root 64 Oct 11 14:28 /proc/self -> 3054
      
    • 프로세스의 상태, 명령줄, 작업 디렉터리, 환경변수, CPU 정보, 메모리 정보 등 다양한 정보를 확인한다.

      디렉터리설명
      /proc/PID/cmdline명령줄 인자
      /proc/PID/cwd현재 프로세스의 작업 디렉터리
      /proc/PID/environ프로세스의 환경변수
      /proc/PID/exe프로세스의 실행 프로그램
      /proc/PID/fd프로세스가 가지고 있는 파일 디스크립터
      /proc/PID/maps실행 프로그램과 라이브러리 등 메모리 맵 정보
      /proc/PID/mem프로세스의 메모리
      /proc/PID/root프로세스의 루트 디렉터리
      /proc/PID/stat프로세스의 상태
      /proc/PID/statm프로세스의 메모리 상태
      /proc/PID/status프로세스의 상태(읽기 가능한)
    • 프로세스의 메모리 맵
      • 메모리상에 실행 프로그램과 라이브러리들이 자리잡은 것
      • /proc/self/maps 열람 시 현재 프로세스의 메모리 맵을 확인할 수 있다.

          $ cat /proc/self/maps
        
  • 시스템 정보

    | 디렉터리 | 설명 | | — | — | | /proc/cmdline | 부팅 시 커널로드할 때 인자로 넘어온 옵션 정보 | | /proc/cpuinfo | CPU 제조사, 모델, 속도, 코어 개수 등 CPU 정보 | | /proc/devices | 현재 시스템에 로드된 디바이스 드라이버 목록 | | /proc/fb | 프레임 버퍼 정보 |

    • 더 많지만 생략

☑️ 작업 예약

at

  • at
    • 지정한 시간에 원하는 명령을 실행한다.
      • 간단한 알림 메시지, 복잡한 스크립트 등
    • 시간을 함께 지정하면 at 명령어 전용 프롬프트가 보여지고 지정한 시간에 실행할 명령어나 스크립트 등을 입력할 수 있다.
    • 모든 입력이 완료되면 Ctrl + D 를 입력한다.
    • 예약된 작업은 /var/spool/at 디렉터리에 개별 파일로 저장된다.
    • 실행결과는 /usr/sbin/sendmail 을 통해 메일로 전송된다.
    • /etc/at.allow/etc/at.deny 환경설정 파일을 통해 at 명령어에 대한 접근제어가 가능하다.
    • 형식

        at [options] time
      
    • 옵션

      옵션설명
      -q- 작업을 위한 큐를 지정한다.
      - 큐는 a~z, A~Z 중 한 가지를 지정한다.
      - 지정하지 않은 경우 기본값은 ‘a’ 큐이고 배치 작업은 ‘b’ 큐이다.
      - 더 높은 글자일수록 nice 값도 올라간다.
      - ‘=’ 큐는 잡을 위한 특별한 큐이다.
      -m작업이 완료되면 사용자에게 메일을 발송한다.
      -M사용자에게 메일을 보내지 않는다.
      -f명령줄이 아닌 파일로부터 실행할 명령을 입력받는다.
      -latq -l 과 동일하며 큐에 있는 모든 작업을 출력한다.
      -d예약한 작업을 삭제한다. (atrm 과 동일)
    • 시간지정
      • 시간지정을 위한 다양한 표현식은 생략
    • 예제

        # 5:22 PM에 my-jobs.txt의 명령어가 실행되고, 출력결과는 모두 메일로 전송
        $ at -m 17:22 < my-jobs.txt 
              
        $ at -l # 큐의 모든 작업 출력
              
        $ at -d 1 # 큐의 작업 삭제
        OR
        $ atrm 1
      
  • atq
    • 현재 예약된 작업 목록을 확인한다.
    • at -l 과 동일하다.
    • 예제

        $ atq # 현재 큐에 들어가 있는 작업 목록을 확인
              
        # 현재 사용자 정보만 출력
        # 시스템 전체 예약 작업을 확인하기 위해 루트 권한을 통해 실행
        $ sudo atq 
      
  • atrm
    • 예약된 작업을 삭제한다.
    • at -d 와 동일하다.
    • 예제

        $ atrm 3 # 작업번호가 3인 예약 작업을 삭제
      
  • 사용자 접근 제어
    • at 은 root 사용자만 사용할 수 있다.
      • /etc/at.allow/etc/at.deny 파일을 통해 일반 사용자도 사용할 수 있도록 허용하거나 차단할 수 있다.
      • 각 파일은 한 줄에 한 명의 사용자 이름을 입력하면 된다.
    • at.allow 파일에 사용자 입력시 해당 사용자만 at 을 사용할 수 있다.
      • at.deny 파일에 사용자를 기재하면 해당 사용자만 at 을 사용할 수 없다.
      • at.deny 보다 at.allow 가 우선시된다.
    • at.deny 가 빈 파일이라면 사용자는 at 을 사용할 수 있다.
      • at.deny 에 어떤 사용자도 기재되어 있지 않아 모든 사용자가 at 을 사용할 수 있다.

크론(cron)

  • 설명
    • 미리 정한 시간에 명령어, 프로그램, 작업 등을 실행할 수 있다.
      • 매일, 매주, 매달 등 반복적으로 실행 가능하다.
    • 현 시각 기준 작업을 실행해야 하는 작업이 있는지 체크하고, 작업이 있으면 이를 실행하는 크론 데몬(crond)과 예약 작업 정보가 담겨있는 설정 파일로 구성된다.
  • 동작 방식
    • 크론 데몬은 전역 사용 목적을 위한 /etc/crontab 과 시스템 유틸리티 등 개별 패키지에 의한 작업 예약을 위한 /etc/cron.d , 개발 사용자를 위한 /var/spool/cron 파일을 감시한다.
    • 추가로 매시간, 매일, 매주, 매달마다 작업 예약을 위한 /etc/cron.hourly , /etc/cron.daily , /etc/cron.weekly , /etc/cron.monthly 파일도 존재한다.
  • 크론 설정 파일
    • 크론 작업을 정의한다.
    • 총 7개의 필드로 구성되어 있다.
    • 분, 시간, 일, 월, 요일, 사용자명, 실행할 명령어 순으로 기재한다.
      • minute : 0~59분 지정
      • hour : 0~23시 지정
      • day of month : 1일 ~31일 지정
      • month : 1~12로 월을 지정하거나 jan, feb, mar, apr 등 문자열로 지정
      • day of week : 0~6으로 요일을 지정. 0 또는 7은 일요일, 1은 월요일, 2는 화요일이다. sun, mon, tue, wed 등으로 지정할 수 있다.
      • user-name : 사용자 이름 명시
      • commnd to be executed : 실행할 명령어 지정
  • 예제

      # 매년 1월 월요일마다 23:01 PM에 backup.sh 스크립트 실행 
      01 23 * Monday /home/francis/backup.sh
        
      # 매일 오전 9시부터 오후 6시까지 hourly-archive.sh 스크립트 실행
      00 09-18 * * * /home/carl/hourly-archive.sh
        
      # 매 토요일 오전 9시와 오후 6시 2차례에 걸쳐 script.sh 실행
      0 9.18 ** Sat /home/francis/script.sh
        
      # 주간(월~금)마다 22:30PM에 backup 명령어 실행
      30 22 * * Mon.Tue.Wed.Thu.Fri /usr/local/bin/backup
    
  • crontab
    • 사용자가 반복적으로 수행할 작업을 예약할 때 사용한다.
    • 설정파일은 /var/spool/cron 밑에 사용자 이름으로 파일이 생성된다.
    • 형식

        crontab [options] file
      
    • 옵션

      옵션설명
      file특정 파일에 설정되어 있는 내용을 크론 설정 파일에 반영한다.
      -u usercrontab을 열람하고 수정할 수 있는 사용자를 지정한다.
      -l현재 crontab 설정을 표시한다.
      -r현재 crontab 설정을 제거한다.
      -e- crontab 설정을 편집한다.
      - 환경변수 VISUAL, EDITOR에 지정되어 있는 편집기가 실행된다.
    • 예제

        $ crontab -e # crontab 설정 편집
              
        $ crontab -i # crontab 설정 표시
              
        $ crontab -r # crontab 설정 삭제
              
        $ crontab -e u francis # francis 사용자의 crontab 설정 편집
              
        $ crontab mycronjob.txt # mycronjob.txt 파일에 있는 내용을 crontab에 반영
      
  • crontab 접근제어
    • at 의 접근제어와 동일하다.
    • 기본적으로 root 사용자만 사용할 수 있다.
    • /etc/cron.allow/etc/cron.deny 파일을 통해 일반 사용자도 cron 명령어를 사용할 수 있도록 허용하거나 차단할 수 있다.
      • 각 파일은 한 줄에 한 명의 사용자 이름을 입력한다.

© 2021. All rights reserved.

yaejinkong의 블로그