프로세스 관리
학습 개요
프로세스 개념을 확인하고 프로세스의 실행과 관련이 있는 실행 파일 또는 디렉토리의 특수 접근권한을 알아보자.
프로세스의 상태를 모니터링하고 관리하는 명령의 사용법을 알아보자.
주기적으로 수행되는 작업을 자동으로 수행하게 하는 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
- 항목의 의미
- 분(0
59), 시(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 |