정보보안공부

Linux_리눅스 프로세스 본문

Linux

Linux_리눅스 프로세스

Steady_sp 2018. 7. 9. 21:08

리눅스 프로세스

- 오라클 가상 머신 사용

- CentOS6

 

<프로세스>

 

#1 프로세스

- 프로세스는 실행중인 프로그램이다.

- 프로그램은 하드디스크에 파일형태로 저장되어있다.

- 프로그램은 실행시에 프로세스를 어떻게 만들지에 대한 광범위한 정보를 담고있다.

- /proc 디렉토리 : 실제 메모리에서 동작중인 상태를 보여주는 가상 파일시스템 디렉토리이다.

- 포르세스의 상태로는 준비, 실행, 대기, 종료 상태를 가지고있는다.

 

#2 프로세스 실행방식

*** 포그라운드 프로세스

-> 사용자와 직접적으로 대화하는 프로세스, bash에서 실행하는 프로그램은 대부분 포그라운드 프로세스로 실행된다.

 

*** 백그라운드 프로세스

-> 사용자와 직접적으로 대화하지 않고 사용자 뒤에서 실행되는 프로세스이다.

-> 데몬, 시스템운영에 필요한 프로세스들이 백그라운드 프로세스로 이미 동작한다.

-> 쉘에서 명령어를 실행할 때 반드시 & 기호를 명령어뒤에 써서 실행해야 백그라운드로 실행된다.

 

*** 프로세스 전환

포그라운드 -> 백그라운드 : Ctrl + Z + bg %작업번호

 

 

백그라운드 -> 포그라운드 : fg 작업번호

 

 

-> fg %작업번호로도 사용가능하다.

 

#3 데몬 프로세스

- 데몬 프로세스는 백그라운드로 동작하면서 외부의 요청에 응답하는 프로세스이거나 특정 서비스를 실행시켜주는 프로세스이다.

- 데몬 프로세스는 터미널에 분리가 되는 특징이 있다. ( 터미널에 분리된 프로세스는 ps aux 로 확인시 TTY 부분에 ?로 표시가 된다. )

- 서비스 데몬 프로그램들의 경로 : 서비스 데몬 프로그램들은 주로 컴파일된 바이너리이므로 관리자가 실행하는 디렉토리인 주로 /usr/sbin 디렉토리에 위치한다.
- 데몬을 실행시켜주는 스크립트는 대부분 서비스명으로 되어있다.
/usr/sbin/crond   /usr/sbin/httpd ...

- 데몬을 실행시키는 스크립트 디렉토리
/etc/rc.d/init.d or /etc/init.d

- 데몬을 실행시키는 스크립트 예
/etc/init.d/데몬스크립트명
/etc/rc.d/init.d/crond or /etc/init.d/crond

 

 

#4 jobs : 실행되는 프로세스를 확인 / kill : 프로세스에 특정 signal 전송

 

*** jobs

 

 

*** kill

- kill 명령어 : 프로세스에 특정한 signal을 보내는 명령이다. 보통 실행중인 프로세스에 종료 신호를 보낸다. 보통 중지시킬 수 없는 프로세스를 종료시킬때 많이 사용한다.
- kill -l 을 통해 여러 signal을 볼 수 있다.

- kill 명령어의 signal번호가 없다면 기본값은 15(SIGTERM) 신호가 보내진다.

- 내부적으로 15번 신호를 막게 프로그래밍이 되었다면 프로세스는 종료되지 않는다.

- kill -9 또는 kill -SIGKILL 로 signal을 프로세스에게 보내게 되면 이 signal은 절대로 막을 수 없다.

 

 

 

#5 ps 명령어를 이용해 모든 프로세스 조회

# ps aux

# ps -ef

 

 

#6 init process

- 리눅스가 부팅하면서 제일 처음에 실행되는 프로세스

- 부모프로세스가 죽으면 자식프로세스가 종료되는 경우도 있지만 그렇지 않은 경우는 init 프로세스가 받아들인다.

 

*** 로그인해서 명령어를 실행시킨 상태

~ init -> login -> bash -> 명령어1 -> 명령어2 ...

 

 

*** 원격 로그인으로 명령어를 실행시킨 상태

~ init -> sshd -> sshd -> bash -> 명령어 1 ...

 

 

*** login 프로세스 종료시 bash쉘의 변화

 

 

#7 부모프로세스와 자식프로세스 확인

*** process1.c

 

 

-> 하나의 프로세스

 

*** process2.c

 

 

-> 해당 코드는 fork()를 이용해 자식 프로세스를 생성하므로 총 2개의 프로세스가 만들어진다.

 

*** 프로세스파일 컴파일후 해당파일 실행

 

 

#8 좀비프로세스 확인

- 좀비프로세스란

- 자식프로세스가 종료되면 리턴 값을 커널에서 전달받게 되는데 부모 프로세스가 커널에 이 값을 요청하여 이 값이 부모 프로세스로 리턴되면 커널이 자식 프로세스를 종료시키게 된다. 그러나 값이 전달되지 못한 경우 커널로부터 자식 프로세스 종료 명령을 받지 못하므로 자식 프로세스는 종료되지 않고 메모리에 남아 좀비 프로세스로 존재하게 된다.

 

*** zombie.c

 

 

-> for를 이용해 자식프로세스를 생성하고 if문을 이용해 부모프로세스 일때와 자식프로세스 일때를 구분한다.

 

*** 실행결과

 

 

-> sleep을 이용해 부모프로세스는 자식프로세스의 종료에 관한 커널의 리턴값을 받지 못하도록 설정하면 자식프로세스는 부모프로세스가 커널의 리턴값을 받을 때 까지 좀비상태로 남게된다.

 

#9 lsof 명령어 

- 일반적으로 시스템에서 동작하고 있는 모든 프로세스에 의해서 열려진 파일들에 관한 정보를 보여주는 시스템 관리 명령어이다

 

*** lsof -i : 기본 열린 포트를 확인한다.

 

 

- lsof -p : 해당 프로세스를 분석한다.

 

 

*** lsof /dev : dev 디렉토리를 분석한다. 디렉토리대신 파일도 가능

 

 

Comments