본문 바로가기

리눅스

데몬(daemon)이란?

데몬(daemon)이란?

가끔씩 리눅스 관련 오픈채팅방이나 이런저런 글을 읽다보면 '데몬'이라는 단어가 눈에 띄었다. 내가 아는 데몬은 demon, '악마'라는 뜻을 가진 단어밖에 없었지만 아무리 생각해도 그 의미는 아니었고 언젠가 짚고 넘어가야 할 개념이기에 직접 탐색을 통해 알아보기로 하였다.

1) 데몬이란?(daemon)

위키피디아의 정의를 빌리자면 다음과 같다.
멀티태스킹 운영 체제에서 데몬은 사용자가 직접적으로 제어하지 않고, 백그라운드에서 돌면서 여러 작업을 하는 프로그램을 말한다.
즉 윈도우의 서비스 같은 개념이라 볼 수 있는데 일반적으로 프로세스의 형식으로 실행되며 데몬이라는 표시를 위해 뒤에는 d가 붙는다고 한다(syslogd 등). 서버 같은 경우에서는 네트워크 서비스를 처리하는 프로그램을 데몬이라 칭한다고 하는 것을 미루어보아 서비스라는 표현은 적절할 것이다.

이름의 유래는 맥스웰의 도깨비에서 따왔다고 하는데 이는 열역학에 영향을 끼치며 일을 하는 도깨비처럼 보이지 않는 곳에서 작업을 하는 백그라운드 프로세스를 귀엽게 표현하였다는 것 같다.

이렇듯 유닉스 계열에서는 데몬을 시스템의 기능을 제공하거나 백그라운드에서 항시 실행되는 프로그램으로 뜻하며 다른 운영체제에서는 '시스템 프로세스'라 불린다. 대부분 시스템의 시작과 끝을 함께한다고 한다. 그렇기에 대개 관리자 권한으로 실행되어 네트워크 요청이나 하드웨어 동작 등 여러 기능을 담당하며 다양한 목적으로 사용된다.

데몬의 특징으로는 부모 프로세스가 없다는 것인데 이에 따라 PPID(부모 프로세스 ID)는 1이며 시스템의 첫 프로세스인 init의 바로 하위에 위치하게 된다(init은 자바의 Object 클래스처럼 모든 프로세스의 직간접 부모인 데몬이며 이것이 없다면 커널 패닉이 발생하게 된다).
엄밀히 말하면 어떤 프로세스가 부모 프로세스가 init, 즉 부모의 ID가 1이며 이를 제어하는 터미널이 없을 때, 즉 사용자 입력으로 종료시킬 수 없을 때 데몬으로 칭하는데 이들은 부모 프로세스가 종료되면 init이 이들을 받아들인다(입양).

데몬은 일반적으로 자식 프로세스를 포크(fork)하여 자기 자신을 복사, 생성한 후 자기 자신은 삭제하여 해당 프로세스를 고아 프로세스로 만든 후 이를 init이 자신의 자식 프로세스로 받아들이도록 하는 과정을 통하여 만들어지며 이를 'fork off and die'라 표현한다.

2) 데몬의 동작 방식?

이를테면 메일 서버는 메일이 언제 도착하고 나갈 지 모르기에 서버 관리자가 항시 대기할 수는 없는데 메일 서버 프로그램이 데몬으로 항시 실행되고 있다면 원활한 운영이 가능할 것이다. 이런 데몬은 크게 두 가지 방법으로 동작하게 된다.


  1. Standalone, 스탠드얼론
  2. Super daemon(xinetd), 슈퍼 데몬
위에서 언급한 메일 서버, 웹 서버처럼 혼자서 요청을 받아 처리하는 데몬(httpd 등)을 스탠드얼론이라고 한다. 서버 서비스의 대부분이 스탠드얼론 방식으로 수행되는데 이 방식으로 네트워크 서비스를 수행한다면 클라이언트의 요청이 언제 들어올지 모르는 상태에서 항상 서비스가 가능하고 다른 메커니즘 없이 바로 데몬이 클라이언트의 요청을 처리할 수 있다.
물론 항상 동작하며 메모리에 상주해야 하기 때문에 서버의 메모리를 많이 소모하고 클라이언트의 요청이 들어올 때마다 처리를 위해 새로운 메모리를 소모한다는 점 등의 문제점이 있다. 따라서 클라이언트의 요청이 많지 않은 네트워크 서비스의 경우 스탠드얼론 방식은 비효율적이라 할 수 있다.

스탠드얼론은 /etc/init.d/ 나 /etc/rc.d/init.d/ 에 있는 스크립트 파일로 실행된다. 대표적으로 SSH 서비스를 찾아볼 수 있으며 이는 '해당 서비스 절대경로' + start/stop/restart 나 'service 서비스 이름' + start/stop/restart로 데몬을 시작하거나 멈추는 등 관리할 수 있다.


두 번째 방법인 슈퍼 데몬(xinetd)은 데몬 자기 자신이 직접 서비스를 수행하지 않고 클라이언트 등에서 들어온 요청에 따라 해당 데몬을 실행시키는 방식이다. inetd라는 데몬(현재는 보안상의 이유로 xinetd)이 받은 메시지에 따라 해당되는 데몬을 메모리에 적재함(출처)으로써 실행하여 서비스를 처리한다.
필요에 따라 데몬을 메모리에 올리기 때문에 대부분의 경우 xinetd를 사용하는 것이 자원 관리 면에서 이득이 있지만 스탠드얼론에 비해서 상대적으로 처리가 늦기 때문에 클라이언트의 요청에 대해 빠른 네트워크 서비스를 제공하기 위해서는 스탠드얼론 방식이 적합할 것이다.

슈퍼 데몬은 xinetd에 의해 다른 데몬을 실행시키지만 xinetd도 데몬이기 때문에 시스템이 켜질 때 스탠드얼론으로 실행된다. 그 후 요청에 따라 다른 데몬을 불러들여 실행시키게 된다. 자세한 정보는 이곳을 참고하자.

또한 슈퍼 데몬 관리에 따른 주의사항은 다음과 같다(출처).

– /etc/xinetd.d/ 디렉토리의 각 서비스파일에 등록되어 있는 데몬들이 root 계정으로 실행되고 있는지 확인

– /etc/xinetd.d/ 디렉토리의 각 서비스파일에 대한 일반유저의 권한은 실행, 읽기, 쓰기 모두 배제. 읽기 권한이 있다면 서버에서 어떤 서비스를 하고 있는지 알고 실행파일의 위치까지도 파악이 가능하기 때문.

– 서버관리자의 실수든 해킹된 것이든 /etc/xinetd.d/ 내의 파일들에게 쓰기( write ) 권한이 설정되어 있다면 어떤 프로그램이든지 만들어서 이 파일에 등록해 두면 root 의 권한으로 실행이 가능하게 됨.



추가 링크:
데몬 관리에 유용한 프로그램 및 실행 정보는 이 블로그를 참고하자.


'리눅스' 카테고리의 다른 글

/etc/passwd, /etc/shadow에 관하여  (0) 2020.07.17
심볼릭 링크란 무엇일까  (2) 2019.07.20