개인/리눅스

[리눅스] 프로세스의 종류와 데몬

OmeGa2 2020. 1. 31. 18:40

프로세스란?

리눅스에서는 한 번에 여러 개의 프로그램이 저장되고 실행할 수 있습니다. 프로그램은 어떤 작업을 위해 사용하는 명령어의 집합으로 보통 프로그램을 설치하면 하드디스크와 같은 보조기억장치에 저장됩니다. 

 

프로그램을 실행하면 메모리(RAM)와 같은 주기억장치로 옮겨오면서 CPU의 자원을 할당받아 실행 중인 프로그램을 "프로세스"라고 합니다. 프로세스에는 PID가 할당되어 관리됩니다.

 

<프로세스의 정의>

실행중인 프로그램

PCB (Process Control Block)를 지닌 프로그램

프로그램 카운터를 가진 프로그램

 

 

프로세스가 실행되는 방법

리눅스에서는 부팅을 시작하면 init프로세스라는 최초의 프로세스를 기준으로 시스템 운영에 필요한 여러 프로세스가 자동으로 실행됩니다. 이때 가장 처음 커널이 실행하는 init 프로세스는 다른 모든 프로세스의 "부모 프로세스"라고 하며 그 아래 실행되는 프로세스를 init프로세스의 "자식 프로세스"라고 부릅니다.

 

이처럼 프로레스가 다른프로세스를 호출하는 방법에는 fork와 exec 두 가지가 있습니다.

 

fork 방식은 프로세스 호출 시 새로 메모리를 할당받아 복사본 형태로 실행하게 되며 기존 프로세스는 그대로 실행되고 있습니다. 

 

exec 방식은 프로세스를 완전히 새로운 프로세스로 대체하면서 호출하는 방식으로 프로세스 실행시 기존의 프로세스는 지워지고 새로운 프로세스만 실행합니다. 

 

리눅스에서는 ps명령으로 현재 실행되는 프로세스를 확인할 수 있으며 처음 로그인했을 때 bash라는 프로세스 (bash 셸)가 자동으로 실행됩니다. 이후 명령어를 실행하면 fork형태로 프로세스가 실행합니다. (만약 exec형태로 실행될 경우 bash쉘이 종료됩니다.)

 

fork 방식으로 실행되는 프로세스

pstree 명령은 프로세스의 구조(부모,자식)를 볼 수 있는 명령어입니다. 처음 ps명령으로 사용 중인 실행 중인 프로세스를 확인했을 때 로그인시 자동 실행되는 bash와 ps명령 두 가지만 있는 것을 확인할 수 있습니다.

 

이후 bash를 하나 더 실행하자 기존 bash 프로세스에 자식프로세스로 bash가 추가되었으며 ps명령으로도 확인했을 때 두 번째 bash의 PPID(부모 프로세스 번호)가 첫 번째 PID로 되어있습니다. 이는 첫 번째 bash에서 두 번째 bash가 실행되었다는 것을 확인할 수 있습니다.

 

 

fork 와 exec 방식의 비교 예시

리눅스에서 명령어는 fork방식으로 실행됩니다. 이는 새로운 메모리를 할당해서 실행되기 때문에 기존 프로세스가 그대로 유지됩니다. -> bash 프로세스가 두 개 그대로 유지

 

exec방식으로 ls명령어를 실행했을 경우 bash가 하나로 줄어든 것을 확인할 수 있습니다. exec방식은 메모리를 새로 할당하지 않고 기존 프로세스에 덮어씌우는 방식이기 때문에 ls 명령을 실행했던 bash에 덮어 씌운 것으로 볼 수 있습니다.

 

 

fork : 새로 메모리를 할당해 프로세스 실행

exec : 기존의 프로세스에 덮어씌우기       

ps    : 현재 실행중인 프로세스 확인        

pstree : 전체 프로세스 구조 확인 (부모, 자식)

리눅스에서는 기본적으로 fork방식 사용

 

 

 

 

 

프로세스가 실행되는 위치

fork와 exec 방식으로 실행된 프로세스들이 실행되는 위치에는 "포어그라운드(foreground)"와 "백그라운드(background)"두 가지가 있습니다.

 

포어그라운드는 프로세스가 실행하는 도중에는 다른 작업을 할 수 없어 프로세스가 종료될 때까지 기다려야 합니다. 실행되는 과정은 출력되지 않으며 그저 언제 끝날지 모를 프로세스를 마냥 기다려야 하는 불편함을 가지고 있습니다.

 

백그라운드 프로세스는 눈에 보이지 않게 뒤에서 실행되는 프로세스를 의미하며, 실행하는 도중에도 작업자는 다른 작업을 진행할 수 있어 멀티태스킹 작업을 할 수 있게 만들어줍니다. 일반적으로 로그 처리, 스케줄링, 모니터링 등의 프로그램에 사용합니다.

 

포어그라운드 : 프로세스 실행 도중 다른작업 불가

백그라운드 : 프로세스 실행도중 멀티태스킹 가능

 

 

백그라운드 작업 예시

프로그램을 백그라운드로 작업하는 방법은 크게 두 가지가 있습니다.

1. 명령어 맨 뒷줄에 "&" 기호를 추가하는 방법

2. 작업 중인 프로세스를 [Ctrl+z] (대기모드) 전환 후 bg 명령 사용

백그라운드에서 수행 중인 프로세스는 jobs 명령으로 확인할 수 있으며 작업 번호와 기호로 관리할 수 있습니다.

 

"[1]" 기호는 작업 번호를 말합니다. 다수의 프로세스가 백그라운드에서 작업하는 도중에는 "fg % 작업 번호" 명령을 이용해서 포어그라운드로 전환할 수 있습니다.

 

"+"기호로 표시된 프로세스가 주로 처리되고 있는 작업을 말합니다. 이후 "-"기호는 다음 작업 예정을 뜻합니다.

 

 

 

 

 

 

 

프로세스에게 보내는 신호

프로세스가 다른 프로세스와 통신할 때 "시그널"이라는 신호를 보내서 통신하게 됩니다. 특정 프로세스에게 작업중지 및 실행 종료 등 여러 가지 신호를 보낼 때는 kill 명령을 사용하거나, 여러 인터럽트 키를 이용해서 신호를 전달할 수 있습니다. "kill -l" 명령으로 보낼 수 있는 시그널의 종류를 볼 수 있습니다.

 

시그널 종류

 

시그널 사용 예시

&기호를 이용해 백그라운드로 실행한 프로세스 두 개를 모두 같은 시그널을 사용해서 종료시켰습니다. 시그널을 사용할 때는 "kill -[번호]" 명령을 사용하거나 "kill -[시그널명]" 두 가지 모두 사용할 수 있습니다. 작업 번호는 "%" 기호를 사용했고 다시 jobs 명령으로 프로세스를 확인했을 때 정상적으로 이루어진 것을 볼 수 있습니다.

 

 

 

<자주 사용하는 시그널>

1. SIGHUP : 재시작할 때 사용

2. SIGINT : 실행 중지 시그널로, 인터럽트 키 [Ctrl+c] 사용

9. SIGKILL : 프로세스 강제 종료

15. SIGTERM : 프로세스 정상종료 (기본 명령)

18. SIGCONT : 정지된 프로세스 실행

19. SIGSTOP : 터미널에서 입력되는 정지 시그널

20. SIGTSTP : 실행 정지 후 재실행 대기 [Ctrl+z] 사용

 

]# kill -[시그널 번호] %[작업 번호]

]# kill -[시그널명] %[작업 번호]

두 가지 동일한 명령어로 사용

 

 

 

 

 

 

 

데몬(Daemon) 이란?

리눅스에서 서버 역할을 하는 프로그램들은 대부분 데몬에 속합니다. 데몬은 지속적인 서비스 요청을 처리하기 위해 백그라운드에서 계속 실행되는 프로세스를 말하며 보통은 프로세스 뒤에 "d" 문자가 붙어있습니다. (ex. httpd)

 

데몬은 대부분 부모 프로세스를 갖지 않습니다. 일반적으로 데몬 프로세스를 실행한 뒤 자신을 죽이면서 고아 프로세스가 된 데몬을 자동으로 init 프로세스가 데려가는 방식으로 실행하며 init 프로세스 바로 아래 위치하게 됩니다. 보통 부팅 시에 실행되어 하드웨어 설정이나 스케줄링 등 다양한 목적으로 사용됩니다. 

 

데몬들도 하나의 프로그램이기 때문에 설치되는 위치가 다르고 효율적인 관리를 위해 부팅되는 런레벨에 따라 동작 유무가 결정됩니다. 부팅에 관련된 정보는 /etc/rc.d 에 위치하고 있으며 관련 데몬은 init.d 디렉터리에서 확인할 수 있습니다.

 

데몬이 실행되는 방법에는 총 두 가지가 있습니다. 

standalone 방식 : 부팅 시에 실행되어 메모리에 계속 상주하면서 들어오는 요청을 처리합니다. 웹이나 이메일 등 빈번하게 요청이 들어오는 경우 대부분 standalone 방식으로 동작되며 ps 명령을 통해 확인할 수 있습니다.

 

inetd 방식 : 메모리에 계속 상주하는 것이 아닌 클라이언트의 요청이 들어왔을 때 프로세스가 실행합니다. 이후 작업이 끝나면 자동으로 프로세스가 종료됩니다. 자동으로 실행, 종료되기 때문에 메모리 관리가 용이합니다.

 

지속적인 서비스를 위한 데몬 프로세스의 실행방식

1. standalone : 부팅 시 실행, 메모리에 항상 상주

2. inetd        : 요청이 들어왔을 때 실행, 작업이 끝나면 자동 종료

 

 

데몬 관련 디렉터리

데몬 프로세스를 관리할 수 있는 디렉터리에는 설치된 데몬에 따라 종류가 다양합니다. 그 중 대표적인 디렉토리 몇가지만 확인해보려고 합니다.

 

/etc/rc.d/init.d

시스템에서 제공되는 서비스에 한해 시작, 중지 명령을 시킬 수 있는 스크립트가 들어있습니다. 설치된 데몬에 따라 제공되는 스크립트를 사용할 수 있는 공간으로 보통 service 명령을 사용해서 디렉토리 안에 스크립트를 쉽게 시작, 중지시킬 수 있습니다. (ex. service named restart)

 

rc/etc/rc.d/rc0.d~rc6.d

부팅 시에 init.d 디렉터리의 스크립트는 init 프로세스가 데몬을 실행할 때 호출합니다. 하지만 런레벨이나 관리자의 필요에 따라 실행되지 않는 서비스가 있습니다. 이런 경우 별도로 제공되는 rc0.d ~ rc6.d 디렉터리에서 실행 레벨(런레벨)에 따라 읽어 들일 수 있는 프로세스가 나뉘게 됩니다. (런레벨이 n이라면 rcn.d 디렉터리를 읽어온다.)