글
프로세스
프로세스란
- 프로세스는 실행중인 프로그램이다
- 프로그램은 하드디스크에 파일 형태로 저장되어 있다.
- 프로그램은 실행시에 프로세스를 어떻게 만들지에 대한 광범위한 정보를 담고 있는 파일이다
운영체제의 실행파일 형식
- Unix , Linux : ELF 포맷을 사용한다.
- Windows : PE 포맷을 사용한다
PE 포맷 : 마이크로소프트의 Window 3.1 부터 지원되는 실행 파일의 형식을 말함 유닉스 COFF를 기반으로
나왔으며 , PE 포맷을 사용하는 파일의 확장자는 cpl , exe , dll , ocx , vxd , sys , scr , drv 가있다
악성코드 중에는 cpl , scr 형태의 확장자로 배포되므로 사용자가 주의해야 한다.
프로세스의 상태
신규 : 프로세스가 생성된 상태
준비 : 프로세스가 처리기의 배정을 기다리고 있는 상태
실행 : 프로세스의 명령이 실행되고 있는 상태
대기 : 프로세스가 어떤 사건이 발생하기를 기다리고 있는 상태
종료 : 프로세스의 실행이 종료된 상태
signal +---------+ signal
.--------- | 중단 중 | <------.
| +---------+ |
v |
+----------+ --------------> +--------+ +--------+
---> | 실행준비 | scheduling | 실행중 | ---> | Zombie |
+----------+ <-------------- +--------+ +--------+
^ |
| input/output(완료) | input/output
| +---------+ |
`--------- | 중단 중 | <------'
+---------+
프로세스의 생성
- 한 프로세스는 다른 프로세스를 fork()를 이용하여 생성하고 exec() 계열의 함수에 의해서 실행
- 부모 프로세스 : 자식 프로세스를 만드는 프로세스
- 자식 프로세스 : 부모 프로세스에 의해 생성된 프로세스
- 부모와 자식은 자원의 일부 혹은 전부를 공유하거나 운영체제로부터 자원을 할당 받는다
bash 프로세스가 명령어를 실행할 때의 상태
부모 프로세스는 자식 프로세스가
+---------------+ 종료되기까지 wait() Wait 상태 +---------------+
---> | 부모 프로세스 | ------------------------------------------> | 부모 프로세스 |
+---------------+ +---------------+
| ^
| fork() 에 의해 |
| 자식 프로세스 생성 | exit() 에 의해
v | 실행 프로세스 종료
+---------------+ +--------------------+ |
| 자식 프로세스 | ------------> | 실행 프로세스 대체 | --------'
+---------------+ +--------------------+
exec() 에 의해
실행해야 할 프로세스로 대체
프로세스의 실행 측면의 두가지 가능성
- fork()로 자식을 생성하면 부모 프로세스와 자식 프로세스가 동시에 실행된다.
- 부모는 자식의 일부 또는 전부가 종료될때까지 wait
- 부모는 wait가 되지 않게 하기 위해서 명령어 뒤에 & 기호를 입력해야 한다.
주소공간의 경우에서 두가지 가능성
- 자식은 부모의 복사판 (fork())
- 자식 프로세스는 별도의 프로그램을 적재 (exec() 계열의 함수 man excl)
프로세스의 종료
- exit 명령
: 자신의 마지막 명령이 수행된 후 운영체제에게 요쳥하고 자신은 종료
- abort 명령
: 강제종료 , 부모프로세스만이 권한 행사
- Xwindow 가 종료가 되면 Xwindow 에서 실행된 프로세스들 모두 종료
- 부모가 종료되면 자식들도 따라서 강제 종료
- 부모가 종료되면 자식들은 init 프로세스가 거둔다
ex)
# ./test.sh 1&
# pstree
init -+
l:
l:
l - sshd --- sshd --- bash -+- pstree
l `-test.sh --- sleep
# /etc/init.d/sshd stop
init -+- acpid
l:
l:
l- sshd --- bash -+- pstree
l `-test.sh --- sleep
프로세스의 우선순위
각 프로세스는 실행시 우선 순위를 가진다
특별히 지정하지 않는다면 우선순위는 모두 동일하게 (0) 으로 지정
nice , renice 명령어를 이용하여 프로세스의 우선순위를 지정할수 있다
nice : 프로세스를 실행할때 우선순위를 지정한다
renice : 실행되고 있는 프로세스의 우선순위를 변경한다
프로세스의 우선순위 범위
+------------+---------------+
-20 0 +19
프로세스의 우선순위 낮추기
+ 방향으로 가면 프로세스의 우선순위가 낮아진다 ( 일반사용자도 사용이 가능)
ex) renice +19 PID
프로세스의 우선순위 높이기
- 방향으로 가면 프로세스의 우선순위가 낮아진다 (일반유저는 권한이없다 root만 가능)
ex) renice -1 PID
프로세스 실행방식
- 포그라운드 프로세스로 실행하는 방식
: 사용자와 직접적으로 대화하는 프로세스
: bash 에서 실행하는 프로그램은 대부분 포그라운드 프로세스로 실행된다
- 백그라운드 프로세스로 실행하는 방식
: 사용자와 직접적으로 대화하지 않고 사용자 뒤에서 실행되는 프로세스
: 데몬 , 시스템 운영에 필요한 프로세스들이 백그라운드 프로세스로 이미 동작한다
: 쉘에서 명령어를 실행할 때 반드시 & 기호를 명령어 뒤에 쓰고 실행해야 백그라운드로 실행된다
: 단 백그라운드로 돌지 않는 프로세스들도 있으므로 이런 프로세스를 백그라운드로 실행시 중지된다
: 중지된 프로세스는 ps 명령어로 확인시 state 에 T(중지) 로 표시된다
프로세스 전환 방법
포그라운드 -> 백그라운드 -> Ctrl + Z + bg %작업번호
백그라운드 -> 포그라운드 -> fg 작업번호
/proc 디렉토리 (가상파일시스템)
- 실제 메모리에서 동작중인 상태를 보여주는 가상 파일 시스템 디렉토리
signal(신호)
-------------+-----------------------------------------------------------------
시그널명 l 설명
-------------+-----------------------------------------------------------------
SIGHUP l 터미널을 잃어버렸을 때 발생한다
SIGABRT l 프로그램의 비정상 종료시 발생한다
SIGINT l Control-C 나 DELETE 키를 입력했을때 발생한다
SIGKILL l 프로세스를 죽이기 위해서 사용한다
SIGPIPE l 단절된 파이프에 write 할경우 발생
SIGSEGV l 잘못된 메모리 참조 ( 주로 포인터를 잘못 썻을때 )
SIGSTOP l 프로세스의 일시 중단 (Ctrl + z)
SIGSUSR1 l 사용자를 위해 정의된 시그널
SIGCONT l 중지된 프로세스를 다시 시작
SIGSTOP l 실행된 프로세스를 중지 시킨다
-------------+-----------------------------------------------------------------
프로세스 전환
- bash 상태에서 기본적으로 실행되는 프로세스는 기본적으로 포그라운드로 동작을 하지만
백그라운드로 동작하는 프로세스도 존재한다
주로 데몬 프로세서들이 이런식으로 동작을 한다
데몬 프로세스는 대부분이 백그라운드로 실행 되게끔 프로그래밍이 되어있다
ex)
# /etc/init.d/crond stop
# /usr/sbin/crond
# ps aux | grep cron
root .... 0:00 /usr/sbin/crond
백그라운드 프로세스 -> 포그라운드 프로세스로 전환
전환하기위해 작업번호를 알아야 한다 (jobs 명령어로 확인)
- 명령어 & <-- background process 로 실행
& -> jobs -> fg %<작업번호>
여러개의 프로세스가 백그라운드로 실행이 된다면
하나의 프로세스만 동작하면 fg만 쓰면 된다
포그라운드 프로세스 -> 백그라운드 프로세스로 전환
중지하고 백그라운드로 전환
Ctrl + Z -> bg %<작업번호>
Ctrl + Z 를 누르면 프로세스는 중지가 되며 bg %<작업번호> 를 하면 다시 동작한다
여러개의 프로세스가 포그라운드로 실행이 된다면
하나의 프로세스만 동작하면 bg만 쓰면 된다
inin process
- 리눅스 부팅하면서 제일 처음에 실행되는 프로세스
- 부모 프로세스가 죽으면 자식 프로세스가 종료되는 경우도 있지만
그렇지 않은 경우는 init(/sbin/init) 프로세스가 받아들인다
login 해서 명령어를 실행시킨 상태
~ init -> login -> bash -> 명령어1 -> 명령어2
sshd (원격 로그인쉘) 해서 명령어를 실행시킨 상태
~ init -> sshd -> sshd -> bash -> 명령어1 ...
init(1)-+
l- sshd(2254)-+-sshd(1279)---bash(1283)-+-grep(8666)
l `-sshd(1830)---bash(1835)
프로세스 관련 명령어
rpm -qf `which ps`
rpm -qi procps
rpm -qi procps | grep bin
rpm -qf `which pstree`
rpm -ql psmisc | grep bin
- ps : 프로세스를 확인한다
모든 프로세스를 보여준다 (BSD계열 , SystemV계열)
사용법
: ps
: ps a
: ps au
: ps x
: ps aux
: ps -ef
: ps 각각의 필드
프로세스 정리
1. 시스템에 동작중인 전체 프로세스를 보는 명령어
ps aux
ps -ef
2. 프로세스에게 신호를 보낼때 쓰는 명령어
kill
3. kill 의 전체 신호 목록을 보는 옵션
kill -l
4. 프로세스를 종료하는 신호
15 : 막을수 있다
9 : 막을수 없다 <-- 이 신호를 받으면 무조건 종료된다 (권한이 있어야 된다)
- 최소한 동등한 권한이거나 높은 권한이어야 종료할 수 있다
- 권한이 낮은 사용자가 -> 권한이 높은 사용자의 프로세르를 종료 할수 없다
5. 자식 프로세스를 생성하는 함수
fork()
6.프로세스에서 명령어를 대체하는 함수
exec() 계열의 함수 . man exec
7. ls /proc 했을 때 나오는 번호(디렉토리)는 무엇인가
/proc 디렉토리에서 번호로 된 디렉토리는 하나의 프로세스에 해당한다.
현재 시스템에서 동작중인 프로세스를 의미하고 ps aux 를 이용해서 나오는 번호와 일치된다
ps 명령어에서 STATE CODE
- 자세한 내용은 man ps로 확인이 가능하다
D : HDD를 엑세스하는 프로세스
R : 실행중인 프로세스
S : Sleep 상태의 프로세스
Z : 좀비 프로세스
< : 우선순위가 높은 프로세스
> : 우선순위가 낮은 프로세스
Ss : session reader
| : multil thread
데몬
네트워크로 서비스 데몬
- 웹서버 , SSH
- 독립데몬 (standalone 방식의 데몬)
- 인터넷슈퍼데몬 (Xinetd 방식의 데몬)
시스템 서비스 데몬
- crond
데몬 (daemon) 프로세스
- 데몬 프로세스는 백그라운드로 동작하면서 외부의 요청에 응답하는 프로세스이거나
특정 서비스를 실행시켜주는 프로세스
- 데몬 프로세스는 터미널에 분리가 되는 특징이 있다
(터미널에 분리된 프로세스는 ps aux 로 확인시 TTY 부분에 ?로 표시가 된다)
- 서비스 데몬 프로그램들의 경로
주로 /usr/sbin 디렉토리에 위치
- 데몬을 실행시켜주는 스크립트는 대부분 서비스명으로 되어있다
/usr/sbin/crond /usr/sbin/httpd...
- 데몬을 실행시키는 스크립트 디렉토리
/etc/init.d/데몬스크립트명
/etc/rc.d/init.d/crond or /etc/init.d/crond
- 데몬을 실행시키는 예
/etc/init.d 디렉토리가 /etc/rc.d/init.d 에 심볼릭 링크가 걸려있다
crond 데몬을 실행 : /etc/rc.d/init.d/crond start
crond 데몬을 실행 : /etc/init.d/crond strar
crond 중지 : /etc/rc.d/init.d/crond stop
crond 중지 : /etc/init.d/crond stop
'Linux > Linux (CentOS)' 카테고리의 다른 글
쉘스크립트 (0) | 2018.07.04 |
---|---|
패키지 관리 (0) | 2018.07.04 |
사용자 그룹 (0) | 2018.07.03 |
디스크 추가 및 관리 (0) | 2018.07.03 |
리눅스 기본설명 & 명령어 (0) | 2018.06.19 |