관리 메뉴

드럼치는 프로그래머

[Linux] 데몬이란? 본문

★─Programing/☆─Linux

[Linux] 데몬이란?

드럼치는한동이 2007. 8. 6. 17:29

1 데몬이란 무엇인가

데몬이란 시스템에 백그라운드 모드로 수행중이며 어떤 사건, 즉 이벤트를 기다리거나 주기적으로 주어진 작업을 수행하기 위하여 대기하고 있는 프로세스를 의미한다. 일반적으로 데몬프로세스는 이름끝에 'd'자가 붙는다.
기본적으로 리눅스에는 여러 기능과 서비스를 제공하기 위한 다양한 데몬 프로세스들이 시스템에서 돌아가고 있다. 이런 기본적인 리눅스 데몬들에 관한 자세한 설명은 LINUX서비스데몬들을 참고하라.
이런 서비스 데몬들의 실행여부는 레드햇 리눅스 계열에서 ntsysv 커맨드로 조정하면 된다. 리눅스상에서 현재 실행되고 있는 데몬의 현황을 보려면 pstree 커맨드를 쓴다.
    [root@localhost root]# pstree 
    init-+-atd 
         |-bash---ami_applet 
         |-bdflush 
         |-crond 
         |-deskguide_apple 
         |-gconfd-1 
         |-gnome-name-serv 
         |-gnome-smproxy 
         |-gnome-terminal-+-bash---vi 
         |                |-bash---pstree 
         |                `-gnome-pty-helpe 
         |-gpm 
         |-kapmd 
         |-keventd 
         |-khubd 
         |-6*[kjournald] 
         |-klogd 
         |-kserver 
         |-ksoftirqd_CPU0 
         |-kswapd 
         |-kupdated 
         |-login---bash---startx---xinit-+-X 
         |                               `-gnome-session---bash 
         |-mdrecoveryd 
         |-5*[mingetty] 
         |-mozilla-bin-+-mozilla-bin---4*[mozilla-bin] 
         |             `-netstat 
         |-nautilus---nautilus---5*[nautilus] 
         |-nmbd 
         |-oafd 
         |-panel 
         |-portmap 
         |-rhn-applet 
         |-rpc.statd 
         |-sawfish 
         |-sendmail 
         |-smbd 
         |-sshd 
         |-syslogd 
         |-tasklist_applet 
         |-xfs 
         `-xinetd---fam 
    
    <리눅스에는 이렇게 많은 서비스데몬들이 실행되고 있다>

2 데몬의 실행방식

데몬의 실행방식은 크게 stand-alone방식과 xinetd(슈퍼데몬)방식이 있다.

2.1 Stand-alone방식

(말뚝보초처럼 항상실행대기)

이 방식의 데몬들은 데몬이 시작되면 말 그대로 자기 스스로 시스템에서 상주하며 클라이언트 요청에 응답을 보내주는 방식으로 보통 아파치 데몬처럼 클라이언트의 요청이 잦은 데몬들이 이런 방식으로 실행된다. 스탠드 얼론방식의 데몬을 확인하려면 쉘상에서 pstree 명령을 내리면 데몬들을 트리형식으로 보여준다. 스탠드 얼론 방식의 데몬들은 xinetd방식보다는 클라이언트 요청에 신속하게 대응한다는 장점은 있으나 이런 스탠드 얼론 데몬들이 시스템에서 많이 생성되게되면 시스템의 자원낭비가 심해지게 되고 퍼포먼스도 떨어지게 된다.

2.2 inetd방식

(클라이언트 요청이 있을때만 실행)

스탠트 얼론처럼 자기 스스로 독립적으로 시스템에 실행되는게아니라 xinetd라는 수퍼데몬이 시스템에서 대기하고 있다고 클라이언트 요청이 들어오면 xinetd데몬에 의해 해당 서비스를 제공해줄 데몬을 실행시키는 방식이다. telnet이나 ftp같이 비교적 클라이언트 요청의 빈도가 낮은 서비스들은 이런 xinetd데몬이 시스템 활용측면에서는 유리하다. 또한 tcp wrapper를 써서 보안을 손쉽게 설정할 수 있는 것도 장점이다. 그러나 전술한 아파치 데몬같이 클라이언트의 자잘한 요청이 많은 서비스에 대해서는 inetd방식이 시스템효율을 도리어 떨어드리게된다. xinetd데몬은 스탠드 얼론방식으로 실행되는 슈퍼데몬이며 서비스 요청시 xinetd데몬의 차일드 프로세스로 다른 데몬이 실행된다. 이를 확인하려면 pstree로 xinetd데몬을 확인하고 다른 한텀창에서 telnet이나 ftp로 자신의 호스트에 접속해보라. 그럼 xinetd데몬에서 차일드 프로세스로 해당 데몬이 실행되는 것을 확인할 수 있다.
[root@localhost home]# pstree 
init-+-atd 
     |-bash---ami_applet 
     |-bdflush 
      ............. 
     |-xfs 
     `-xinetd---fam 

 
<트리 끝부분에 xinetd데몬이 떠 있는 것을 확인 할 수 있다.> 
[root@localhost root]# pstree 
init-+-atd 
     |-bash---ami_applet 
     |-bdflush 
      ...... 
     |-xfs 
     `-xinetd-+-fam 
              `-in.telnetd---login 
xinetd데몬은 곧 설명할 /etc/xinetd.d 디렉토리 내에서 설정한다.

3 데몬관리

3.1 ntsysv

스탠드 얼론 데몬들은 레드햇 계열에서 ntsysv로 조정한다. ntsysv 커맨드를 내리면 시스템 데몬들의 리스트가 나타나고 아스트리크(*) 표시가 되어 있는 데몬들이 시스템에서 실행되는 데몬들이다. 특정데몬을 실행시키고 싶으면 스페이스바로 *표시를 토글시키면 된다. 예를 들어 데스크탑으로 쓰는 리눅스 박스에서 sendmail과 kuduz데몬은 꺼두는 것이 부팅속도를 조금 높여주는 방법이 된다.
이 ntsysv에 의해 제어되는 데몬들은 레드햇 리눅스에서는  /etc/rc.d/init.d 에 등록이 되어 있다. 쉘상에서 데몬을 제어하고자 한다면 service 명령을 쓰며 데몬명과 start, stop, restart 커맨드를 사용할 수 있다.
예를 들어 네트웍 데몬을 재실행하고자 할 때
#service network restart 
과 같이 하면된다.

3.1.1 ntsysv에 데몬등록하기

rpm같은 바이너리 패키지로 설치한 어플은 ntsysv에 자동으로 등록되지만 소스로 설치한 어플은 ntsysv에 등록이 안된다. 이때는 소스로 프로그램을 설치하다보면 실행과 정지를 편하게 할수 있는 스크립트가 있다. 이것을 /etc/rc.d/init.d 밑에 카피하면 ntsysv에 등록이 되는데 그냥 카피하면 안되고 점을 제거하고 카피하면 이상 없이 등록이 된다. 만약 mysql.server 이라는 것을 등록한다면 카피할 때 mv mysql.server mysqld 라고하고 mv bnetd.init bnetd 라고 하면된다. 이 때 카피할 스크립트 첫부분에 다음과 같은 문장을 넣어주어야 한다.
#!/bin/sh # MySQL: Starts the MySQL Server # # chkconfig: 2345 90 90 # 
description: A very fast and reliable SQL database engine. 
즉 chkconfig 설정 부분이 들어가야 한다는 것이다. 자세한 것은 man chkconfig로 알아보면 된다.
chkconfig --add mysqld

3.2 xinetd설정

슈퍼데몬의 설정은 /etc/xinetd 에서 이루어진다.
[root@localhost root]# cd /etc/xinetd.d 
[root@localhost xinetd.d]# ls 
chargen      daytime      echo      finger  rexec   rsh      services  talk    time      wu-ftpd 
chargen-udp  daytime-udp  echo-udp  ntalk   rlogin  servers  sgi_fam   telnet  time-udp 
[root@localhost xinetd.d]#  
telnet 스크립트 파일을 열어보자. 
# default: on 
# description: The telnet server serves telnet sessions; it uses  
#       unencrypted username/password pairs for authentication. 
service telnet 
{ 
        disable = no 
        flags           = REUSE 
        socket_type     = stream 
        wait            = no 
        user            = root 
        server          = /usr/sbin/in.telnetd 
        log_on_failure  += USERID 
} 
disable옵션은 데몬을 실행시킬 것인지를 결정하는 옵션으로 no로 되어 있으면 서비스 요청시 실행하게 되고 yes로 하면 실행시키지 않는다. socket_type은 stream은 TCP, dgram은 UDP방식을 의미한다.
서비스 포트 자체를 막고자 한다면 /etc/services 를 수정하면 되고 데몬 서비스는 이 스크립트 파일의 disable옵션을 조정해주면 되는 것이다.

4 stand alone데몬을 inetd방식으로 바꾸기

실습겸으로 stand alone방식의 데몬을 inetd방식의 데몬으로 바꾸어보도록 하자. 실습할 어플리케이션은 Proftpd이다. proftpd설정파일은 /etc/proftpd.conf 이다. 이 파일을 열어보면 proftpd는 기본적으로 stand alone방식으로 돌아가고 있다는 것을 알 수 있다.
    # This is a basic ProFTPD configuration file (rename it to # 'proftpd.conf' for actual use. It establishes a single server # and a single anonymous login. It assumes that you have a user/group # "nobody" and "ftp" for normal operation and anon. ServerName "ProFTPD Default Installation" ServerType standalone DefaultServer on 
    <ServerType가 프로세스 실행방식을 나타낸다.>
pstree로 현재 시스템에서 확인해보자
[leedw@choco ~]$ pstree init-+-atd |-bdflush |-nmbd |-portmap |-proftpd ...... 
    <proftpd가 standalone으로 실행중이다.>
이제 이 프로세스를 inetd방식으로 바꾸어보자. 일단 proftpd 설정파일인 /etc/proftpd.conf 를 열어 ServerType을 inetd로 수정한다.
ServerType inetd 
그리고 /etc/xinetd.d 로 가서 프로세스 스크립트 파일을 만들어야 한다. proftpd란 파일명으로 아래와 같이 작성한다.
service ftp { socket_type = stream wait = no user = root server 
= /usr/sbin/proftpd log_on_success += DURATION nice = 10 disable = no } 
server에 프로세스 실행파일의 경로명을 적어줘야 한다. which등으로 찾아서 패스를 적어준다.
이제 현재 스탠드얼론으로 실행중인 proftpd를 시스템에서 죽여줘야 한다. killall로 proftpd를 끝낸다.
#killall proftpd 
그리고 xinetd설정이 적용될 수 있도록 수퍼데몬인 xinetd를 재실행시켜줘야 한다.
#service xinetd restart 
이제 ftp로 호스트에 접근해보면 proftpd가 xinetd의 차일드 프로세스로 실행되는 것을 확인 할 수 있을 것이다.
[leedw@choco ~]$ pstree init-+-atd ............ |-vmware-guestd |-xfs `-xinetd-+-in.telnetd---login---bash---ftp |-in.telnetd---login---bash---pstree `-proftpd 
원본 : [펌] 데몬
Comments