프로세스 관리

  • 학습 개요
    프로세스 개념을 확인하고 프로세스의 실행과 관련이 있는 실행 파일 또는 디렉토리의 특수 접근권한을 알아보자.
    프로세스의 상태를 모니터링하고 관리하는 명령의 사용법을 알아보자.
    주기적으로 수행되는 작업을 자동으로 수행하게 하는 cron 서비스를 알아보자

  • 학습 목표

    1. 프로세스 개념과 프로세스의 상태 변화를 설명할 수 있다.
    2. 포어그라운드와 백그라운드 프로세스의 차이를 설명할 수 있다.
    3. 프로세스의 상태를 확인하고 관리하는 명령을 사용할 수 있다.
    4. cron 서비스를 이용해 주기적으로 반복되는 작업을 실행할 수 있다.

프로세스

프로세스 정의

  • 커널에 등록되어 관리를 받는 작업 또는 실행중인 프로그램
    • 커널은 프로세스 관리 블록(PCB)에 프로세스에 관한 정보를 저장
    • 프로세스틑 시스템 자원을 사용하여 여러 상태 변화를 겪음
    • 각 브로세스는 유일한 PID를 가짐
  • 프로세스 예
    • init 프로세스는 PID가 1
      • 모든 사용자 프로세스의 조상
    • 로그인을 하거나 터미널 창을 열면 'bash 프로세스'가 할당 됨
    • 필요에 따라 프로세스는 자식 프로세스를 생성함
    • 데몬 프로세스는 서비스 요청을 처리하기 위한 백그라운드 프로세스

프로세스 관리 블록

  • 커널에 등록된 각 프로세스에 대한 정보를 저장하는 영역
    • 프로세스들은 모두 커널 공간에 자신의 정보를 가짐
  • PCB에 저장되는 정보
    • PID, PPID
    • UID, EUID, GID, EGID
    • 프로세스의 현재 상태
      • 실행/준비/조류/지연 등의 상태 정보와 CPI 사용 시간등
    • 프로세스 우선순위
    • 프로세스가 사용 중인 자원에 관한 정보
      • 메모리 주소, 입출력 장치, 파일등
    • 모든 대기중인 시그널 목록
    • 문맥 교환 정보

명령의 실행과 프로세스 생성

  • 쉘에서 명령을 실행하면 새로운 프로세스가 만들어져 처리됨
    • 시스템 호출 fork()를 호출하여 기존 부모 프로세스가 자신의 복사본 자식 프로세스를 만듦
    • 자식 프로세스는 시스템 호출 exec(program)에 의해 새로운 프로그램으로 대체되어 실행됨
    • 프로그램이 종료되면 자식 프로세스가 종료됨
    • 부모 프로세스는 보류 상태에 있다가 자식 프로세스가 종료되면 깨어남
  • 예)
    • 터미널 창에서 ls 명령을 실행하면
    • 쉘은 fork() 를 호출하여 쉘의 복사본(자식 프로세스)를 생성함
    • 자식 프로세스는 exec(ls)를 호출하여 ls 명령을 실행함
  • pstree 명령은 프로세스 트리를 보여주는 명령
[ec2-user@ip-aws ~]$ pstree
systemd─┬─acpid
        ├─2*[agetty]
        ├─amazon-ssm-agen───7*[{amazon-ssm-agen}]
        ├─atd
        ├─auditd───{auditd}
        ├─chronyd
        ├─crond
        ├─dbus-daemon
        ├─2*[dhclient]
        ├─gssproxy───5*[{gssproxy}]
        ├─lsmd
        ├─lvmetad
        ├─master─┬─pickup
        │        └─qmgr
        ├─rngd
        ├─rpcbind
        ├─rsyslogd───2*[{rsyslogd}]
        ├─sshd───sshd───sshd───bash───pstree
        ├─systemd-journal
        ├─systemd-logind
        └─systemd-udevd

포어그라운드(foreground) 프로세스

  • 쉘 프롬프트에서 명령을 실행하면 포어그라운드 모드로 수행됨
    • 포어그라운드 프로세스가 끝나기 전에는 다른 명령을 수행할 수 없음
      • 포어그라운드 프로세스는 터미널에 대한 제어권을 가짐
    • 포어그라운드 프로세스틑 키보드 입력 및 화면 출력이 가능함
      • 터미널로부터 키보드 입력을 받을 수 있는 프로세스는 하나 뿐임
  • 포어그라운드로 실행중인 프로세스를 강제 중지 -> ctrl + c
  • 포어그라운드로 실행중인 프로세스를 백그라운드로 전환/멈춤 또는 지연 상태로 변경 -> ctrl + z
    • fg jobid bg jobid를 수행하면 실행상태가 됨.

백그라운드(background) 프로세스

  • 백그라운드로 실행하려면 쉘 프롬프트에서 명령의 끝에 &를 추가하여 실행
    • 백그라운드로 프로세스를 실행시키면 쉘은 즉시 명령 대기 상태가 됨
      • 백그라운드 프로세스는 터미널 출력은 가능하나 키보드 입력은 받을 수 없음
      • 백그라운드 프로세스가 키보드 입력이 필요하면 지연 상태가 됨
    • 입력 없이 장시간 실행되어야 하는 경우 주로 사용
    • 터미널 창을 종료하면 연결된 백그라운드 프로세스도 종료 됨
  • 백그라운드 프로세스를 포어그라운드로 전환하는 방법 -> fg jobid
  • jobs 명령으로 백그라운드 프로세스의 상태를 점검할 수 있음
    • jobs -l은 PID를 함께 보여줌

특수권한

SetUID

  • 파일의 접근권한에서 소유자의 실행 권한에 x가 아닌 s 가 표시됨
  • 실행 파일에 SetUID가 설정되어 있으면, 해당 파일이 실행될 때 '실행시킨 사용자'가 아닌 '파일의 소유자' 권한으로 실행
  • 일반 사용자가 passwd 명령으로 비밀번호를 수정하면 결국 /etc/passwd 또는 /etc/shadow 파일이 수정되어야 함(권한 상승이 필요함)
  [ec2-user@ip-aws ~]$ ls -l /etc/passwd
  -rw-r--r-- 1 root root 1304 Oct  4 08:35 /etc/passwd
  [ec2-user@ip-aws ~]$ ls -l /usr/bin/passwd
  -rwsr-xr-x 1 root root 27776 Feb 13  2020 /usr/bin/passwd
  • 설정 방법은 chmod 4755 file 또는 chmod u+s file
  • 해제 방법은 chmod 0755 file 또는 chmod u-s file

SetGID

  • 파일의 접근권한에서 그룹의 실행 권한에 s가 표시됨
  • SetGID가 설정된 파일을 실행하면 '실행자의 그룹 권한'이 아닌 '파일 소유자의 그룹 권한'으로 실행됨
  • 디렉토리에 설정된 경우, 그 디렉토리에 파일을 만들 때 '파일 소유 그룹'이 '디렉토리의 소유 그룹'으로 지정됨
  • 설정 방법은 chmod 2755 file || chmod g+s file

StickyBit

  • 파일의 접근권한에서 기타 사용자의 실행 권한에 t가 표시됨
  • 주로 공유 디렉토리에 설정되며, 누구나 그 디렉토리에 파일 생성할 수 있지만 파일의 소유자만 삭제할 수 있음
  • chmod 1755 file || chmod o+t file

프로세스의 상태

프로세스의 상태 변화

제한된 자원과 멀티 태스킹을 지원하는 운영체제에서 프로세스는 여러 상태 변화를 겪음
(이미지 그러 넣기)

ps 명령

  • 현재 프로세스의 상태를 확인하는 명령
    • 특정 순간에 활동 중인 프로세스의 상태를 보여줌
  • ps [options]
    • 옵션 없이 ps 명령을 실행하면 현재 터미널과 연결괴어 있응 프로세스 중 프로세스의 EUID가 현재 사용자의 UID와 같은 프로세스를 선택하여 보여줌
    • ps -ef, ps aux 명령이 자주 사용되는 옵션임
      • 결과에서 PPID는 부모의 PID, STIME은 시간, TTY는 터미널, TIME은 cpu 누적 사용 시간
[ec2-user@ip-aws ~]$ ps -ef --forest
UID        PID  PPID  C STIME TTY          TIME CMD
root         2     0  0 Oct04 ?        00:00:00 [kthreadd]
root         4     2  0 Oct04 ?        00:00:00  \_ [kworker/0:0H]
root         6     2  0 Oct04 ?        00:00:00  \_ [mm_percpu_wq]
root         7     2  0 Oct04 ?        00:00:03  \_ [ksoftirqd/0]
...
root         1     0  0 Oct04 ?        00:00:32 /usr/lib/systemd/systemd --switched-r
root      1932     1  0 Oct04 ?        00:00:42 /usr/lib/systemd/systemd-journald
root      1955     1  0 Oct04 ?        00:00:00 /usr/sbin/lvmetad -f
root      1968     1  0 Oct04 ?        00:00:00 /usr/lib/systemd/systemd-udevd
root      2653     1  0 Oct04 ?        00:00:06 /sbin/auditd
libstor+  2681     1  0 Oct04 ?        00:00:04 /usr/bin/lsmd -d
root      2687     1  0 Oct04 ?        00:00:34 /sbin/rngd -f
dbus      2689     1  0 Oct04 ?        00:00:21 /usr/bin/dbus-daemon --system --addre
...
root      2703     1  0 Oct04 ?        00:00:00 /usr/sbin/gssproxy -D
root      2920     1  0 Oct04 ?        00:00:00 /sbin/dhclient -q -lf /var/lib/dhclie
root      3025     1  0 Oct04 ?        00:00:02 /sbin/dhclient -6 -nw -lf /var/lib/dh
root      3173     1  0 Oct04 ?        00:00:04 /usr/libexec/postfix/master -w
postfix   3175  3173  0 Oct04 ?        00:00:00  \_ qmgr -l -t unix -u
postfix  22117  3173  0 11:27 ?        00:00:00  \_ pickup -l -t unix -u
...
root      3392     1  0 Oct04 ?        00:00:08 /usr/sbin/sshd -D
root     20986  3392  0 10:54 ?        00:00:00  \_ sshd: ec2-user [priv]
ec2-user 21004 20986  0 10:55 ?        00:00:00      \_ sshd: ec2-user@pts/0
ec2-user 21005 21004  0 10:55 pts/0    00:00:00          \_ -bash
ec2-user 22903 21005  0 11:43 pts/0    00:00:00              \_ ps -ef --forest
...
  • 옵션
옵션 설명
a 터미널과 연결된 모든(all) 사용자의 모든 프로세스를 출력함
-A 또는 -e 모든(every) 사용자의 모든 프로세스를 출력함
u 현재 사용자의 프로세스를 사용자 친화적(user-oriented)로 자세히 출력함
x 현재 사용자가 소유한 모든 프로세스를 출력함. 데몬 프로세스처럼 터미널과 연결되어 있지 않은 프로세스도 출력함
-u users
U users
--user=users
EUID가 주어진 users(사용자 명이나 UID)와 같은 프로세스를 출력함
여러 사용자를 표시할 때는 콤마(,)나 빈칸으로 구분함
-p PIDs 주어진 PID를 가진 프로세스를 출력함
e 프로세스 정보에 관한 환경변수 정보를 포함시켜 출력함
I 또는 -ㅣ 또는 -f 프로세스에 관한 많은(long or full) 정보를 출력함
o format 또는 -o format 출력을 원하는 항목을 지정하여 출력함

프로세스 관리

top 명령

  • 현재 실행 중인 프로세스의 모니터링과 관리를 위한 대화식 도구
    • 현재 실행중인 개별 프로세스의 실시간 정보를 주기적으로 보여줌
      • CPU와 메모리 사용량 및 시스템의 부하 등을 확인
    • ps 명령의 동적 / 대화식 버전
  • top [options]
  • 옵션
    • -p delay : 초 단위로 주기를 지정
    • -p pid, -u user : 특정 프로세스나 사용자 프로세스로 한정
    • -S : 총 CPU 사용시간(자식 프로세스 포함) 출력
  • 기본적으로 CPU 사용량이 많은 프로세스를 먼저 보여줌
  • top명령에서 헤더의 의미는 ps 명령과 유사함
  • 대화식 서브 명령
옵션 설명
Space Bar 화면을 갱신함
k kill 명령을 수행함
r renice 명령을 수행
u 명령 옵션에서 -u의 의미와 같음
M %MEM 값으로 정렬
N PID 값으로 정렬
P %CPU 값으로 정렬
T Time + 값으로 정렬
q top 명령을 종료

kill 명령

  • 프로세스에 시그널을 보내는 명령
    • 다른 프로세스에게 시그널을 보내도록 커널에 요청하는 것
    • 시그널은 프로세스를 관리하는 방법이고 프로세스 간 통신수단
    • 여러 종류의 시그널이 존재하며 기본 시그널은 TERM임
  • kill [-signal] pids
  • kill [-s signal] pids
    • signal은 시그널의 이름 또는 시그널 번호
    • kill pids 명령은 TERM 시그널을 보냄
    • kill -STOP 3188 3188 PID를 가진 프로세스에게 멈춤 시그널을 보냄

killall 명령

  • 특정 프로세스에 한꺼번에 시그널을 보내는 명령
  • killall [options] [-s signal] [-u user] names
    • 프로그램이나 프로세스의 이름을 사용
    • killall -i -d 9 -u jeaha bash는 확인을 거쳐 jeaha 계정의 bash 프로세스에게 kill 시그널을 보냄
  • 시그널의 종류
번호 이름 설명
1 HUP 터미널이 종료될 때 터미널에 연결된 모든 프로세스에게 보내짐.
또는 데몬 프로세스가 설정 파일을 다시 읽어 재시작하게 만들 때 사용하는 시그널
2 INT Interrupt의 의미로 터미널에서 ctrl + c 를 누르는 것과 같음
9 KILL kill의 의미로 프로세스를 강제로 즉시 종료시킴
15 TERM Terminate의 의미로 kill 명령의 기본 시그널. 정상적인 종료 방법으로 끝내게 함
18 CONT Continue의 의미로 STOP 시그널로 중단된 프로세스를 재개시킴
19 STOP Stop의 의미로 프로세스를 잠시 중단시킴
20 TSTOP Terminal Stop의 의미로 터미널에서 ctrl + z를 누르는 것과 같음

nice와 renice

  • 'nice 우선순위(NI) 값'을 조정하는 명령
  • NI 값은 -20(가장 높음) ~ 19(가장 낮음)
    • 우선순위가 높으면 CPU를 점유할 확률이 높음
    • 기본 NI 값은 0

nice [option] [command]

  • 명령을 실행할 때 NI 값을 조정하는 명령
  • 일반 사용자는 NI 값을 0 이상으로만 지정할 수 있음
  • 옵션
    • -n adjustment || -adjustment 는 조정 수치 만큼 NI 값을 조정
    • nice -n +5 top || nice -+5 top은 NI 값을 5 증가 시켜 우선순위를 낮춤

renice priority [option]

  • 실행 중인 프로세스의 NI 값(절댓값)을 바꾸는 명령
  • 일반 사용자는 자신이 소유한 프로세스의 우선순위를 낮출 수만 있음
  • 옵션
    • -p pids는 프로세스를 지정
    • -g gids는 GID를 지정
    • -u users는 사용자를 지정
    • renice 10 -u jeaha는 관리자 또는 본인이 jeaha 계정이 소유한 모든 프로세스의 NI 값을 10으로 조정함

nohup

  • HUP 시그널과 무관하게 명령이 스스로 종료될 때까지 계속 수행시키는 명령
    • 로그아웃을 하거나 터미널 창을 끝내면 프로세스에 HUP 시그널이 보내짐
  • nohup 명령을 실행하는 경우 명령 행의 끝에 '&'를 붙여 백그라운드로 실행해야 함
    • nohup find -size + 100k > catalina.out &
    • 표준 출력과 표준 에러 출력이 필요한 경우 ~/nohup.out에 출력됨

프로세스 관리를 위한 GUI

  • 데스크탑 메뉴에서 '프로그램 > 시스템 도구 > 시스템 정보'를 실행
    • '시스템 정보'창에서 모든 또는 자신이 소유한 프로세스의 상태를 보고 [편집] 메뉴에서 제어할 수 있음

cron 서비스

  • 지정된 시간에 주기적으로 자동 수행되는 작업을 수행함
  • crond 데몬 프로그램이 서비스를 제공
    • 1분 간격으로 'crontab 파일'을 검사하여 수행함
    • 'crontab 파일'에는 'cron 작업의 수행 방법'이 기록되어 있음
    • 일반적으로 'cron 작업'은 쉘 스크립트로 작성됨
  • cron 서비스를 이용한 자동 스케줄
    • /etc/crontab 파일과 /etc/cron.d/ 디렉토리에 존재하는 파일
      • 시스템 수준에서 주기적으로 수행될 작업을 설정
    • crontab
      • 개별 사용자는 crontab 명령을 이용하여 주기적으로 수행될 작업을 설정할 수 있음

crontab 파일의 형식

  • 환경 변수의 설정과 cron 작업의 수행 방법을 정의
[ec2-user@ip-aws ~]$ cat /etc/cron.d/0hourly
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly
  • 항목의 의미
    • 분(059), 시(024), 날짜(031), 달(112), 요일(0~7)
      • *는 매번을 의미, 간격 표시를 위해/, 범위 표시를 위해 -와 ,를 사용할 수 있음
    • 사용자, 실행할 명령
      • 사용자는 시스템 수준 crontab 파일의 경우에만 지정
      • run-parts는 지정된 디렉토리에 있는 스크립트를 수행하는 명령
    • 0 _/6 _ * 1-5 /bin/mail -s "Hi" jeaha@localhost
    • 월요일부터 금요일 까지 0, 6, 12, 18시 정각에 메일을 보냄

crontab

  • 일반 사용자가 자신의 cron 작업을, 자신의 crontab 파일에 등록할 때 사용해야 하는 명령
    • /var/spool/cron/username 파일로 만들어지거나 수정 권한이 없음
  • crontab [option]
  • 옵션
    • -l : crontab 파일의 내용으로 출력
    • -e : crontab 파일을 vi로 편집할 수 있음
      • * * * * * date >> ~/date.txt 를 입력한 후 확인해 볼 것
    • -r : crontab 파일 삭제
    • -u : user는 지정된 사용자의 crontab 파일을 사용(권한 필요)
  • 지정된 시간에 일회성 작업을 예약하려면 at 명령을 사용
728x90
반응형

'OS > Linux' 카테고리의 다른 글

[Linux] 쉘 스크립트 -2  (0) 2020.11.08
[Linux] 소프트웨어 관리  (0) 2020.11.01
[Linux] 파일 시스템 관리  (0) 2020.10.25
[Linux] vi 사용 텍스트 편집  (0) 2020.10.25
[Linux] 사용자 관리  (0) 2020.10.25

+ Recent posts