프로세스 관리
- 학습 개요 
 프로세스 개념을 확인하고 프로세스의 실행과 관련이 있는 실행 파일 또는 디렉토리의 특수 접근권한을 알아보자.
 프로세스의 상태를 모니터링하고 관리하는 명령의 사용법을 알아보자.
 주기적으로 수행되는 작업을 자동으로 수행하게 하는 cron 서비스를 알아보자
- 학습 목표 - 프로세스 개념과 프로세스의 상태 변화를 설명할 수 있다.
- 포어그라운드와 백그라운드 프로세스의 차이를 설명할 수 있다.
- 프로세스의 상태를 확인하고 관리하는 명령을 사용할 수 있다.
- cron 서비스를 이용해 주기적으로 반복되는 작업을 실행할 수 있다.
 
프로세스
프로세스 정의
- 커널에 등록되어 관리를 받는 작업 또는 실행중인 프로그램- 커널은 프로세스 관리 블록(PCB)에 프로세스에 관한 정보를 저장
- 프로세스틑 시스템 자원을 사용하여 여러 상태 변화를 겪음
- 각 브로세스는 유일한 PID를 가짐
 
- 프로세스 예- init 프로세스는 PID가 1- 모든 사용자 프로세스의 조상
 
- 로그인을 하거나 터미널 창을 열면 'bash 프로세스'가 할당 됨
- 필요에 따라 프로세스는 자식 프로세스를 생성함
- 데몬 프로세스는 서비스 요청을 처리하기 위한 백그라운드 프로세스
 
- init 프로세스는 PID가 1
프로세스 관리 블록
- 커널에 등록된 각 프로세스에 대한 정보를 저장하는 영역- 프로세스들은 모두 커널 공간에 자신의 정보를 가짐
 
- 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 명령을 이용하여 주기적으로 수행될 작업을 설정할 수 있음
 
 
- /etc/crontab 파일과 /etc/cron.d/ 디렉토리에 존재하는 파일
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
- 예- 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 |