Total
Search
1. 프로세스
1.1. 프로세스 정의
•
커널에 등록되어 관리받는 '실행 중인 프로그램'
◦
커널은 프로세스 관리 블록(PCB)에 프로세스에 관한 정보를 저장
◦
프로세스는 시스템 자원을 사용하며 여러 상태 변화를 겪음
◦
각 프로세스는 유일한 PID를 가짐
•
프로세스 예
◦
systemd 프로세스는 PID가 1
▪
모든 사용자 프로세스의 조상 프로세스
◦
로그인을 하거나 터미널 창을 열면 bash 프로세스가 할당됨
◦
필요에 따라 프로세스는 자식 프로세스를 생성함
◦
데몬 프로세스는 서비스 요청을 처리하기 위한 백그라운드 프로세스
1.2. 프로세스 관리 블록
•
프로세스 관리 블록(PCB)
◦
커널에 등록된 각 프로세스에 대한 정보를 저장하는 영역
◦
프로세스들은 모두 커널 공간에 자신의 정보를 가짐
•
PCB에 저장되는 정보
◦
PID와 PPID
◦
UID와 EUID 및 GID와 EGID
◦
프로세스의 현재 상태
▪
실행/준비/보류/지연 등의 상태 정보와 CPU 사용 시간 등
◦
프로세스 우선순위
◦
프로세스가 사용 중인 자원에 관한 정보
▪
메모리 주소, 입출력 장치, 파일 등
◦
모든 대기 중인 시그널의 목록
◦
문맥 교환 정보
1.3. 명령의 실행과 프로세스의 생성
•
셸에서 명령을 실행하면 새로운 프로세스가 만들어져 처리됨
◦
시스템 호출 fork()를 호출하여 기존 부모 프로세스가 자신의 복사본 자식 프로세스를 만듦
◦
자식 프로세스는 시스템 호출 exec(program)에 의해 새로운 프로그램으로 대체되어 실행됨
◦
프로그램이 종료되면 자식 프로세스가 종료됨
◦
부모 프로세스는 보류 상태에 있다가 자식 프로세스가 종료되면서 깨어남-
•
예
◦
터미널 창에서 ls 명령을 실행하면
◦
fork()를 호출하여 셸의 복사본(자식 프로세스)을 생성함
◦
자식 프로세스는 exec(ls)를 호출하여 ls 명령을 실행함
•
pstree 명령은 프로세스 트리를 보여주는 명령
1.4. 포어그라운드 프로세스
•
셸 프롬프트에서 명령을 실행하면 포어그라운드 모드로 수행됨
◦
포어그라운드 프로세스는 터미널에 대한 제어권을 가짐
◦
포어그라운드 프로세스는 키보드 입력 및 화면 출력이 가능함
▪
터미널로부터 키보드 입력을 받을 수 있는 프로세스는 하나뿐임
◦
포어그라운드 프로세스가 끝나기 전에는 다른 명령을 수행할 수 없음
•
포어그라운드 실행 중인 프로세스를 강제 종료하려면 Ctrl + C를 입력하여 강제로 중지
•
포어그라운드 실행 중에 멈춤(또는 지연) 상태로 전환하려면 Ctrl + Z를 입력하면 백그라운드로 전환되며 "중지" 상태가 됨
◦
fg jobId 또는 bg jobId 명령을 실행하여 실행 상태로 복구 가능
1.5. 백그라운드 프로세스
•
백그라운드로 실행하려면 셸 프롬프트에서 명령의 끝에 &를 추가하여 실행
◦
백그라운드 프로세스를 실행시키면 셸은 즉시 명령 대기 상태가 됨
▪
백그라운드 프로세스는 터미널 출력은 가능하나 키보드 입력은 받을 수 없음
▪
백그라운드 프로세스가 키보드 입력이 필요하면 지연 상태가 됨
◦
입력 없이 장시간 실행되어야 하는 경우 주로 사용
◦
터미널 창을 종료하면 연결된 모든 백그라운드 프로세스도 종료됨
•
백그라운드 프로세스를 포어그라운드로 전환하는 방법
◦
셸에서 fg jobId를 실행
•
jobs 명령으로 백그라운드 프로세스의 상태를 점검할 수 있음
◦
jobs -l 명령은 PID를 함께 보여줌
1.6. 특수권한
•
SetUID
◦
일반 사용자가 passwd 명령어로 비밀번호를 수정하면, 결국 /etc/passwd 또는 /etc/shadow 파일이 수정되어야 함(권한 상승 필요)
◦
실행 파일에 SetUID가 설정되어 있으면, 해당 파일이 실행될 때 실행시킨 사용자가 아닌 파일의 소유자 권한으로 실행됨
▪
프로세스의 EUID는 파일의 소유자가 됨
◦
파일의 접근권한에서 소유자의 실행 권한에 x가 아닌 s가 표시됨
$ ls -l /etc/passwd
-rw-r--r--. 1 root root 2161 8월 11 01:51 /etc/passwd
$ ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 32656 5월 15 2022 /usr/bin/passwd
Shell
복사
◦
설정 방법
chmod 4755 file
chmod u+s file
Shell
복사
◦
해제 방법
chmod 0755 file
chmod u-s file
Shell
복사
•
SetGID
◦
파일의 접근권한에서 그룹의 실행 권한에 s가 표시됨
◦
SetGID가 설정된 파일을 실행하면, 실행자의 그룹 권한이 아닌 파일 소유자의 그룹 권한으로 실행됨
◦
디렉터리에 설정된 경우
▪
디렉터리에 파일을 만들 때, 파일의 소유 그룹이 디렉터리의 소유 그룹으로 지정됨
▪
그룹 구성원의 공유 공간으로 사용 가능
◦
설정 방법
chmod 2775 file
chmod g+s file
Shell
복사
•
StickyBit
◦
파일의 접근권한에서 기타 사용자의 실행 권한에 t가 표시됨
◦
주로 공유 디렉터리에 설정되며:
▪
누구나 디렉터리에 파일을 생성 가능
▪
파일의 소유자만 삭제할 수 있음
◦
설정 방법
chmod 1777 file
chmod o+t file
Shell
복사
◦
예시
$ ls -ld /tmp
drwxrwxrwt. 18 root root 4096 9월 11 11:57 /tmp
Shell
복사
2. 프로세스의 상태
2.1. 프로세스의 상태 변화
•
제한된 자원 하에 멀티태스킹을 지원하는 운영체제에서 프세스는 여러 상태 변화를 겪음
2.2. ps 명령
•
프로세스의 현재 상태를 확인하는 명령
◦
특정 순간에 활동 중인 프로세스의 상태를 보여줌
•
ps [options]
◦
옵션 없이 ps 명령을 실행하면 현재 터미널과 연결되어 있는 프로세스 중 프로세스의 EUID가 현재 사용자의 UID와 같은 프로세스를 선택하여 보여줌.
◦
ps -ef와 ps aux 명령은 모든 사용자의 모든 프로세스에 관한 많은 정보를 보여줌.
◦
결과에서 PPID는 부모의 PID, STIME은 시작 시간, TTY는 터미널, TIME은 CPU 누적 사용 시간.
•
예시)
$ ps -ef -forest
UID PID PPID C STIME TTY TIME CMD
<중간 생략>
root 1 0 0 11:19 ? 00:00:03 /usr/lib/systemd/systemd rhg
kdhong 2100 1 0 11:21 ? 00:00:00 /usr/lib/systemd/systemd --user
kdhong 2930 2100 0 11:21 ? 00:00:04 \_ /usr/libexec/server
kdhong 2962 2930 0 11:21 pts/0 00:00:00 | \_ bash
kdhong 9100 2962 0 12:01 pts/0 00:00:00 | \_ ps -ef --forest
Bash
복사
•
옵션
옵션 | 설명 |
a | 터미널과 연결된 모든(all) 사용자의 모든 프로세스를 출력함. |
-A 또는 -e | 모든(every) 사용자의 모든 프로세스를 출력함. |
u | 현재 사용자의 프로세스를 사용자 친화적(user-oriented)으로 자세히 출력함. |
x | 현재 사용자가 소유한 모든 프로세스를 출력함. 데몬 프로세스처럼 터미널과 연결되어 있지 않은 프로세스도 출력함. |
-u users / U users / --user=users | EUID가 주어진 users(사용자명이나 UID)와 같은 프로세스를 출력함. 여러 사용자를 표시할 때는 콤마(,)나 빈칸으로 구분함. |
-p PIDs | 주어진 PID를 가진 프로세스를 출력함. |
e | 프로세스 정보에 환경변수 정보를 포함시켜 출력함. |
l 또는 -l 또는 -f | 프로세스에 관한 많은(long or full) 정보를 출력함. |
o format 또는 -o format | 출력을 원하는 항목을 지정하여 출력함. 예: ps -o pid,ppid,uid,cmd |
3. 프로세스 관리
3.1. top 명령
•
현재 실행 중인 프로세스의 모니터링과 관리를 위한 대화식 도구
◦
현재 실행 중인 개별 프로세스의 실시간 상황을 주기적으로 보여줌
▪
프로세스의 상태, CPU와 메모리 사용량 및 시스템의 부하 등을 확인
◦
ps 명령의 동적-대화식 버전
•
top [options]
•
옵션
◦
-d delay: 초 단위로 주기를 지정
◦
-p pids와 -u user: 특정 프로세스나 사용자 프로세스로 한정
◦
-S: 총 누적 CPU 사용 시간(자식 프로세스 포함)을 출력
•
사용 예시
◦
기본적으로 CPU 사용량이 많은 프로세스를 먼저 보여줌
3.2. kill 과 killall명령
•
kill 명령
◦
프로세스에 시그널을 보내는 명령
▪
다른 프로세스에게 시그널을 보내도록 커널에게 요청하는 것
▪
시그널은 프로세스를 관리 방법이고 프로세스 간 통신 수단
▪
여러 종류의 시그널이 존재하며 기본 시그널은 TERM임
◦
kill [-signal] pids
◦
kill [-s signal] pids
▪
signal: 시그널의 이름 또는 시그널 번호
▪
kill pids 명령은 TERM 시그널을 보냄
▪
예: kill -STOP 3188 → 해당 PID를 가진 프로세스에게 멈춤 시그널을 보냄
•
killall 명령
◦
특정 프로세스에 한꺼번에 시그널을 보내는 명령
◦
killall [options] [-s signal] [-u user] names
▪
프로그램이나 프로세스의 이름을 사용
▪
예: killall -i -s 9 -u kdhong bash
▪
kdhong 계정의 bash 프로세스에서 확인을 거쳐 KILL 시그널을 보냄
3.4. 시그널의 종류
번호 | 이름 | 의미 |
1 | HUP | 터미널이 종료될 때 터미널에 연결된 모든 프로세스에게 보냄. 또는 데몬 프로세스가 설정 파일을 다시 읽어 재시작하게 만들 때 사용하는 시그널 |
2 | INT | Interrupt의 의미로 터미널에서 Ctrl+C를 누르는 것과 같음 |
9 | KILL | Kill의 의미로 프로세스를 강제로 즉시 종료시킴 |
15 | TERM | Terminate의 의미로 kill 명령의 기본 시그널. 정상적인 종료 방법으로 끝내게 함 |
18 | CONT | Continue의 의미로 STOP 시그널로 중단된 프로세스를 재개시킴 |
19 | STOP | Stop의 의미로 프로세스를 잠시 중단시킴 |
20 | TSTP | Terminal Stop의 의미로 터미널에서 Ctrl+Z를 누르는 것과 같음 |
3.5. 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 [options]
◦
실행 중인 프로세스의 NI 값(절댓값)을 바꾸는 명령
◦
일반 사용자는 자신이 소유한 프로세스의 우선순위를 낮출 수만 있음
•
옵션
◦
-p pids: 프로세스를 지정
◦
-g gids: 그룹을 지정
◦
-u users: 사용자를 지정
◦
예: renice 10 -u jjpark → 관리자(또는 본인)가 jjpark 계정이 소유한 모든 프로세스의 NI 값을 10으로 조정
3.6. nohup 명령
•
HUP 시그널과 무관하게 백그라운드 명령이 스스로 종료될 때까지 계속 수행시키는 명령
◦
로그아웃을 하거나 터미널 창을 끝내면 백그라운드 프로세스에도 HUP 시그널이 보내짐
•
nohup 명령을 실행하는 경우, 명령 행의 끝에 &를 붙여 백그라운드로 실행해야 함
•
예
◦
nohup find -size +100k > log.txt &
◦
표준 출력과 표준 에러 출력이 필요한 경우 ~/nohup.out에 리다이렉션되어 덤프됨