"데몬"의 두 판 사이의 차이
(→주요 데몬) |
(→터미널의 부재) |
||
(사용자 2명의 중간 판 18개는 보이지 않습니다) | |||
1번째 줄: | 1번째 줄: | ||
− | '''데몬'''(daemon)은 [[ | + | '''데몬'''(daemon)은 데몬은 [[리눅스]] 시스템이 처음 가동될 때 실행되는 백그라운드 프로세스이다. 사용자의 요청을 기다리고 있다가 요청이 발생하면 이에 적절히 대응하는 리스너와 같은 역할을 한다. 즉, 메모리에 상주하면서 특정 요청이 오면 즉시 대응할 수 있도록 대기 중인 프로세스를 말한다. 예약된 시간이나 이벤트의 요청이 발생했을 때 지정된 서비스가 실행된다. 영어 발음은 '''데이먼'''(deɪmən) 또는 '''디먼'''(dimən)에 가깝다. |
==개요== | ==개요== | ||
− | 데몬은 | + | 데몬은 [[멀티태스킹]] 운영체제에서 사용자가 직접적으로 제어하지 않고, [[백그라운드]]에서 돌면서 여러 작업을 하는 프로그램을 말한다. 시스템 로그를 남기는 syslogd 명령어처럼 보통 데몬을 뜻하는 ‘d’를 이름 끝에 달고 있으며, 일반적으로 프로세스로 실행된다.<ref name="이름2">데몬 (컴퓨팅) 위키백과 - https://ko.wikipedia.org/wiki/%EB%8D%B0%EB%AA%AC_(%EC%BB%B4%ED%93%A8%ED%8C%85)</ref> 일반적인 서비스는 각각의 서비스가 사용하는 포트(port)를 관리하는 데몬이 존재한다. 다른 데몬들에게 할당된 포트를 관리하는 특별한 용도의 데몬도 존재한다. 데몬은 부팅 중에 메모리에 로딩되어 컴퓨터가 종료될 때까지 유지된다. 데몬은 서버가 죽을 때까지 자원을 점유하고 있는 형태여서 많은 데몬이 실행된다면 자원 소비가 크다. 마이크로소프트 윈도우의 서비스와 유사하여 실제로 서비스라고 부르기도 한다. 보통 [[리눅스]] 시스템의 1번 프로세스인 init(PID=1)이 실행하고, 데몬 프로그램의 명령어는 'd'로 끝난다. (예: ftpd, mysqld, httpd 등)<ref name="이름">powerhan, 〈[https://powerhan.tistory.com/33 daemon 이란 무엇인가?]〉, 《티스토리》, 2009-01-04</ref> |
− | + | 데몬은 주기적인 서비스 요청을 처리하기 위해 계속 실행되는데, 수집된 요구들을 또다른 프로그램이나 프로세스들이 처리할 수 있도록 적절히 전달한다. 데몬은 대개 부모 프로세스를 갖지 않아 PPID가 1로 세팅되는데, 이는 데몬이 다른 어떤 프로세스의 영향도 받지 않음을 의미한다. 따라서 프로세스 트리에서 init 바로 아래에 위치한다. 데몬이 되는 방법은 일반적으로 자식 프로세스를 [[포크]](fork)하여 생성하고 자식을 분기한 자신을 죽이면서 init이 고아가 된 자식 프로세스를 자기 밑으로 데려가도록 하는 방식이다. 이러한 방법을 ‘포크 오프 앤 다이(fork off and die)’라 부르기도 한다. 시스템은 시동할 때 데몬을 시작하는 경우가 많으며, 이런 데몬들은 [[네트워크]] 요청, [[하드웨어]] 동작, 여타 프로그램에 반응하는 기능을 담당하게 된다. 그 밖에도 몇몇 리눅스에 있는 devfsd 처럼 하드웨어 설정이나, 크론(cron)처럼 주기적인 작업을 실행하는 등 기타 다양한 목적으로 사용된다. CD나 DVD에 대한 각종 CD 이미지 파일을 에뮬레이션하여 가상의 CD-ROM 드라이브의 역할을 하게 하게 하며, 시디스페이스와 비슷하다. | |
− | + | ==어원== | |
+ | 도깨비나 유령을 뜻하는 데몬이란 이름은 [[매사추세츠 공과대학교]]의 MAC 프로젝트 프로그래머들이 만든 것이다. 처음 만들어질 때는 맥스웰의 도깨비(Maxwell's demon) 사고 실험에서 맥스웰이 언급한 보이지 않는 곳에서 분자들을 골라주는 일을 하고 있는 유령에서 영감을 얻은 것이었다. 이후 유닉스 시스템은 이 용어를 받아들여 사용했다. 그리스 신화에서도 신들이 관여하지 않는 일을 처리하는 데몬이 등장하는데, 이는 사용자가 직접 신경쓰지 않도록 하면서 백그라운드에서 일을 처리해 주는 데몬의 역할과 맞아 떨어진다. BSD 계열의 운영 체제는 BSD 데몬을 마스코트로 삼았으나, 실제로 BSD의 마스코트는 기독교적 세계에서 그리는 악마의 모습을 귀엽게 만든 것이다. 또한 원래 daemon(데몬)은 두문자어가 아니지만, Disk And Execution MONitor로 두문자어처럼 뜻을 맞추어 말하기도 한다.<ref name="이름2"></ref> | ||
− | == | + | ==특징== |
− | + | ===터미널의 부재=== | |
+ | 데몬은 터미널 세션과 연결되어 있지 않아 특별한 일이 없는 한 사용자와 상호 대화할 필요 없이 아무도 모르게 실행되어야 하기 때문에 터미널을 가지지 않는다. 대부분의 데몬은 관리자(superuser) 권한으로 실행되며, 컨트롤링(controlling) 터미널을 가진 데몬은 없다. 데몬이 컨트롤링 터미널을 가질 때 두 가지 문제점이 생길 수 있다. 첫 번째는 사용자가 터미널 탈출 문자를 써서 원치 않게 프로세스를 끝내 버리거나 정지시킬 수 있다는 것이다. 두 번째는 원격 터미널 연결이 끊길 경우 원치 않게 프로세스가 종료될 수 있다. 이와 관련해 다음과 같은 관례가 있다. | ||
+ | # 데몬이 잠금 파일을 이용하면, 그 파일은 /var/run 폴더 아래에 저장한다. 여기에 파일을 만들려면 관리자 허가가 필요하다. | ||
+ | # 만약 데몬이 구성 옵션을 제공하면, 그 파일은 /etc 폴더에 저장 구성 옵션 이름은 name.conf이다. | ||
+ | # 데몬이 명령줄에서 시작될 수 있지만 일반적으로 초기화 스크립트 중 하나에서 시작한다. | ||
+ | # 보통 구성 파일이 있다면 시작할 때만 확인한다. 그래서 다시 읽으려면 데몬을 재시작해야 하는데 이게 싫다면 터미널 인터페이스의 연결이 종료되면 받는 시그널인 sighup 시그널을 잡아서 구성 파일을 다시 읽게 한다.<ref> park jong hyun, 〈[http://tmmse.xyz/2017/10/19/daemon/ 데몬 프로세스 (daemon process)]〉, 《개인블로그》, 2017-10-19</ref> | ||
− | ==실행 방법== | + | ===실행 방법=== |
− | 리눅스에서 데몬을 실행하는 방법은 크게 | + | 리눅스에서 데몬을 실행하는 방법은 크게 두 가지가 있다. 혼자 스스로 동작하는 독자형(standalone)방식과 데몬을 관리하는 슈퍼 데몬(super daemon)에 의해 동작하는 방식(xinetd)이 있다. 일반적으로 자주 사용하는 데몬을 독자형 방식으로, 자주 사용하지 않는 데몬을 슈퍼 데몬을 이용한 방식으로 실행한다. 독자형의 경우 시스템의 백그라운드에서 항상 동작하는데, 자주 호출되는 데몬이 아니라면 시스템의 자원을 낭비할 우려가 있다. 독자형 방식은 /etc/init.d/ 나 /etc/rc.d/init.d/에 있는 스크립트 파일로 실행된다. 대표적으로 [[SSH]] 서비스를 찾아볼 수 있으며 이는 '해당 서비스 절대 경로 + start/stop/restart' 나 '서비스 이름 + start/stop/restart'로 데몬을 시작하거나 멈추는 등 관리할 수 있다. |
− | + | 슈퍼 데몬에 의한 동작 방식은 평소에는 슈퍼 데몬만 동작하다가 서비스 요청이 오면 슈퍼 데몬이 해당 데몬을 동작시키는 것이다. 따라서 독자형보다는 서비스에 응답하는데 시간이 좀 더 걸릴 수 있지만 자원을 효율적으로 사용한다는 장점이 있다. 슈퍼 데몬을 이용한 방식의 서비스와 독자형 방식의 가장 다른 점은 클라이언트가 서비스를 요청할 때 자동으로 올라간다는 것이다. 슈퍼 데몬에 의해 동작하는 방식은 관리자가 서버를 올리거나 내리거나 할 필요가 없고 항상 메모리 점유하는 게 아니므로 편리하고 메모리 사용에 효율적이다. 만약 리눅스 서버를 웹서버로 사용한다면, 사용자의 웹 서비스 요청이 매우 빈번히 일어날 것이고, 따라서 [[HTTPS]]와 같은 웹서버 데몬은 독자형 방식으로 실행된다. 독자형이든 슈퍼 데몬에 의해 동작하는 형태든 데몬이 제대로 동작하지 않으면 시스템이 서비스를 제공할 수 없다. | |
− | |||
− | |||
− | + | * '''독자형 방식에 해당되는 서비스''' : [[센드메일]](sendmail), [[아파치]](apache), [[마이에스큐엘]](MySQL), [[네임서버]](name server), [[NFS]] | |
− | + | * '''슈퍼 데몬 방식에 해당되는 서비스''' : [[텔넷]](telnet), [[POP3]], [[핑거]](finger)<ref name="이름"></ref><ref> 토토로(ikssun), 〈[http://blog.naver.com/PostView.nhn?blogId=ikssun&logNo=150040483850&parentCategoryNo=3&viewDate=¤tPage=1&listtype=0 (Linux) 서비스 운영 방식 (standalone 과 xinetd)]〉, 《네이버 블로그》, 2009-01-08</ref> | |
− | |||
− | |||
− | == | + | ===종류=== |
− | + | ====슈퍼 데몬==== | |
− | + | 데몬의 종류가 늘어나자 이를 관리하기 위한 슈퍼 데몬이 등장했다. 슈퍼 데몬은 커널 2.2버전과 2.4버전이 차이가 있다. 커널 2.2버전(리눅스 6.x) 버전에서는 inetd라는 이름을 사용하였으며, 전체적인 환경 설정은 /etc/inetd.conf에서 통합 관리하였고, 슈퍼 데몬에 속한 데몬들은 TCP 래퍼(Wrapper)라는 프로그램에 의해 접근이 제어되었다. 커널 2.4버전(리눅스 7.x 버전 이후)에서는 xinetd(eXtended internet services daemon)라는 이름의 슈퍼 데몬이 작동되고 환경설정은 /etc/xinetd.conf와 /etc/xinetd.d 디렉토리의 각 서비스 파일에서 관리한다. 슈퍼 데몬은 네트워크 서비스를 제공하는 데몬만 관리한다. 간단히 말해 사용자가 네트워크 서비스를 요청하면 슈퍼 데몬이 이를 받아서 해당하는 서비스 데몬을 동작시키는 것이다. 일반 데몬들처럼 프로세스가 항상 떠있지 않고, 클라이언트의 요청이 있는 경우에만 데몬을 실행시킨다. 응답 시간은 좀 걸리지만 메모리가 절약된다. | |
− | |||
− | |||
− | |||
− | == | + | ====init 데몬==== |
+ | init 데몬은 1번 프로세스이며 프로세스 대부분의 조상 프로세스이다. 대부분의 사용자 레벨 데몬은 프로세스 그룹 리더이자 세션 리더이고 그룹과 세션에 혼자 있는데, 사용자 레벨 데몬의 부모는 init 프로세스이다. pstree 명령으로 프로세스들의 실행 구조를 확인해보면 init가 다른 데몬의 조상임을 다시 한 번 더 알 수 있다. | ||
− | :{|class=wikitable width= | + | init-+-acpid |
+ | |-apache2---7*[apache2] | ||
+ | |-atd | ||
+ | |-cron | ||
+ | |-dbus-daemon | ||
+ | |-dhclient | ||
+ | |-6*[getty] | ||
+ | |-login---bash | ||
+ | |-mongod---10*[{mongad}] | ||
+ | |-mysqld---16*[{mysql1d}] | ||
+ | |-ntpd | ||
+ | |-rsyslogd---3*[{rsyslogd}] | ||
+ | |-sshd---sshd---bash---pstree | ||
+ | |-systemd-logind | ||
+ | |-systemd-sdevd | ||
+ | |-upstart-file-br | ||
+ | |-upstart-socket- | ||
+ | ’-spstart-udev-br | ||
+ | |||
+ | ====커널스레드 데몬==== | ||
+ | 커널의 일부분을 프로세스처럼 관리하는 데몬을 커널 데몬이라고 한다. 이는 ps 명령으로 확인했을 때 대괄호로 둘러싸여 있는 프로세스들이다. 예전에는 대부분 k로 시작했으나, 요즘은 이를 반드시 준수하지 않는다. 커널 데몬은 대부분 입출력이나 메모리 관리, 디스크 동기화 등을 수행하며, 대체로 PID가 낮은 번호로 할당되어 있다. 일반 프로세스의 조상 데몬이 init라면 커널 데몬을 동작시키는 조상 데몬은 커널스레드 데몬(kthreadd)이다. ps 명령으로 확인해보면 모든 커널 데몬의 PPID가 2번임을 알 수 있다.<ref name="ㅇㅇ"> 카르 kaelina, 〈[https://rrhh234cm.tistory.com/194 ( 기본정리 ) 데몬 프로세스]〉, 《티스토리》, 2016-05-10</ref> | ||
+ | |||
+ | UID PID PPID C STIME TTY TIME : CMD | ||
+ | root 1 0 0 Apr08 ? 00:00:12 : /sbin/init | ||
+ | root 2 0 0 Apr08 ? 00:00:00 : [kthreadd] | ||
+ | root 3 2 0 Apr08 ? 00:00:00 : [ksoftirqd/0] | ||
+ | root 5 2 0 Apr08 ? 00:00:00 : [kworker/0:0H] | ||
+ | root 7 2 0 Apr08 ? 00:00:00 : [kworker/u:0H] | ||
+ | root 8 2 0 Apr08 ? 00:00:00 : [migration/0] | ||
+ | root 9 2 0 Apr08 ? 00:00:19 : [rcu_preempt] | ||
+ | root 10 2 0 Apr08 ? 00:00:00 : [rcu_bh] | ||
+ | |||
+ | ====inetd 데몬==== | ||
+ | inetd(internet service daemon)는 유닉스 시스템에서 돌아가는 슈퍼 서버 데몬으로서 인터넷 서비스들을 제공한다. 각 설정된 서비스들을 위해서, 이것은 연결된 클라이언트들로부터 요청을 리슨한다. 요청들은 적절한 실행 파일을 실행시키는 과정을 통해 서비스되지만, 반향(echo) 같은 간단한 것들은 inetd 스스로 처리한다. 요청에 따라 실행되는 외부 실행 파일들은 단일 또는 다중스레드일 수 있다. 처음 4.3BSD에서 공개되었으며, 일반적으로 /usr/sbin/inetd에 위치한다. 종종 슈퍼 서버로 불리는 inetd는 FTP, POP3 그리고 텔넷 등의 서비스들에서 사용하는 포트들을 리슨 한다. TCP 패킷 또는 UDP 패킷이 특정한 목적 포트 번호로 도착하면, inetd는 적절한 서버 프로그램을 실행해서 연결을 처리하게 한다. 고하중으로 실행되도록 설계되지 않은 서비스들의 경우에 이 방식이 매우 효율적인게, 특정한 서버를 오직 필요할 때만 실행시킬 수 있기 때문이다. 게다가 inetd가 생성한 프로세스의 stdin, stdout 그리고 stderr을 직접 후킹하므로 서비스 프로그램들에서 네트워크 코드가 필요치 않다. 빈번한 트래픽이 발생하는 HTTP나 POP3 서버의 경우에는 트래픽을 직접 받는것이 더 선호된다.<ref>inetd 위키백과 - https://ko.wikipedia.org/wiki/Inetd</ref> | ||
+ | |||
+ | 이밖에 리눅스에서 각종 서비스를 제공하기 위한 주요 데몬은 다음과 같다.<ref name="ㅇㅇ"></ref> | ||
+ | |||
+ | :{|class=wikitable width=500 | ||
!align=center|데몬 | !align=center|데몬 | ||
!align=center|기능 | !align=center|기능 | ||
|- | |- | ||
− | + | |align=center|atd | |
− | + | |align=center|특정 시간에 실행하도록 예약한 명령 실행(at 명령으로 예약) | |
|- | |- | ||
− | + | |align=center|crond | |
− | + | |align=center|주기적으로 실행하도록 예약한 명령 실행 | |
|- | |- | ||
− | + | |align=center|dhcpd | |
− | + | |align=center|동적으로 IP 주소를 부여할 수 있도록 하는 서비스 제공 | |
|- | |- | ||
− | + | |align=center|httpd | |
− | + | |align=center|웹 서비스 제공 | |
|- | |- | ||
− | + | |align=center|IPD | |
− | + | |align=center|프린트 서비스 제공 | |
|- | |- | ||
− | + | |align=center|nfs | |
− | + | |align=center|네트워크 파일 시스템 서비스 제공 | |
|- | |- | ||
− | + | |align=center|named | |
− | + | |align=center|DNS 서비스 제공 | |
|- | |- | ||
− | + | |align=center|sendmail | |
− | + | |align=center|이메일 서비스 제공 | |
|- | |- | ||
− | + | |align=center|smtpd | |
− | + | |align=center|메일 전송 데몬 | |
|- | |- | ||
− | + | |align=center|popd | |
− | + | |align=center|기본 편지함 서비스 제공 | |
|- | |- | ||
− | + | |align=center|routed | |
− | + | |align=center|자동 IP 라우터 테이블 서비스 제공 | |
|- | |- | ||
− | + | |align=center|smb | |
− | + | |align=center|삼바 서비스 제공 | |
|- | |- | ||
− | + | |align=center|syslogd | |
− | + | |align=center|로그 기록 서비스 제공 | |
|- | |- | ||
− | + | |align=center|sshd | |
− | + | |align=center|원격 보안 접속 서비스 제공 | |
|- | |- | ||
− | + | |align=center|in.telnetd | |
− | + | |align=center|원격 접속 서비스 제공 | |
|- | |- | ||
− | + | |align=center|ftpd | |
− | + | |align=center|파일 송수신 서비스 제공 | |
|- | |- | ||
− | + | |align=center|ntpd | |
− | + | |align=center|시간 동기화 서비스 제공 | |
− | | | + | |} |
− | + | ||
+ | ===구분=== | ||
+ | 윈도우에서는 서비스, 리눅스에서는 데몬이라는 용어로 불린다. 데몬은 사용자와의 직접적인 상호작용이 없는 백그라운드에서 동작하는 기능을 관리한다. 필요하면 사용자가 명시적으로 시작하지 않아도 부팅 등 특정 상황에서 자동으로 실행하도록 설정할 수 있다. 작업 실행이 실패했을 때의 재시도 정책 등, 실패 시의 정책을 지정할 수 있으며 이를 위한 기능들을 지원하기도 한다. | ||
+ | |||
+ | 윈도우에서 서비스로 실행될 바이너리 파일을 작성하려면, 프로그래밍 단계에서부터 RegisterServiceCtrlHandler 등의 몇몇 서비스 구현을 위한 전용 윈도우 [[API]] 함수를 이용한 연동 작업이 필요하다. 리눅스에서는 이러한 별도 작업이 없어도, 실행 파일이라면 무엇이든 데몬으로 동작할 수 있다. 데몬으로 동작할 바이너리를 작성하는 경우 대부분 shell 등으로부터 데몬 프로세스를 분리하기 위해 포크를 호출하지만, nohup 등의 다른 선택지도 있고 포크는 일반적인 시스템콜(system call)일 뿐 데몬만을 지원하기 위한 것도 아니다. 윈도우에서는 실행 파일뿐 아니라 DLL도 서비스로 구동할 수 있다. 실제로 윈도우상에서 기본적으로 제공되는 많은 서비스가 DLL로 만들어져있다. DLL을 바로 프로세스로 만들 수는 없으므로 svchost.exe라는 실행 파일에서 해당 DLL의 진입점(entry point)를 호출하는 방식으로 서비스를 구동한다. 반면 리눅스에서 데몬으로 구동될 수 있는 것은 실행 파일뿐이다. 윈도우에서는 프로세스와 서비스가 1:1 관계가 아니다. DLL을 이용하여 서비스 구동 시, 혹은 실행 파일 작성 시 각 서비스의 진입점 설정 등을 통해 하나의 프로세스에서 둘 이상의 서비스를 실행시킬 수 있다. 리눅스의 데몬은 사실상 백그라운드 프로세스와 동의어다. 둘 이상의 데몬이 하나의 프로세스 하에서 동작하는 경우는 없다. | ||
+ | 윈도우에는 서비스 실행만을 위해 존재하는 계정들이 존재한다. 로컬 서비스(local service), 로컬 시스템(local system),네트워크 시스템(network system)이 그것이다. 이 계정들은 관리자(administrator), 로컬 관리자(local administrator)처럼 기본으로 제공되는 계정이지만 별도의 비밀번호를 가지지 않으며, 로그인도 불가능하다. LookupAccountBbyName() 등 몇몇 계정 관리용 API의 대상도 될 수 없다. 윈도우에서 서비스 설정 시, 서비스를 실행할 별도의 계정을 지정하지 않거나 특정 타입만을 지정할 경우, 서비스 실행 시 위의 계정을 이용하여 서비스를 시작한다. 이러한 계정들은 고유의 권한 셋을 가진다. 특히 로컬 시스템 계정의 경우 로컬 어드미니스트레이터 계정과 거의 유상한 권한 셋을 가지지만 어드미니스트레이터는 아니기에 때때로 오작동의 원인이 되기도 한다. 반면 리눅스에서는 데몬 실행만을 위한 계정은 존재하지 않는다. 보안 및 관리의 편리함 등을 위해 데몬 실행 시 별도의 계정 권한을 지정하거나 하는 경우가 많고, 특정 계정의 쉘 로그인을 금지하는 등 제약을 걸 수도 있지만, 데몬 실행만을 위해 특별한 설정을 제공하는 계정은 없다.<ref> 민영기TD, 〈[https://blog.ifunfactory.com/2018/02/27/windows-service%EC%99%80-linux-daemon%EC%9D%98-%EB%B9%84%EA%B5%90/ (기술컬럼) Windows service와 Linux daemon의 비교]〉, 《아이펀팩토리 블로그》, 2018-02-27</ref> | ||
{{각주}} | {{각주}} | ||
==참고자료== | ==참고자료== | ||
− | * 위키백과 - https://ko.wikipedia.org/wiki/%EB%8D%B0%EB%AA%AC_(%EC%BB%B4%ED%93%A8%ED%8C%85) | + | * inetd 위키백과 - https://ko.wikipedia.org/wiki/%EB%8D%B0%EB%AA%AC_(%EC%BB%B4%ED%93%A8%ED%8C%85) |
* powerhan, 〈[https://powerhan.tistory.com/33 daemon 이란 무엇인가?]〉, 《티스토리》, 2009-01-04 | * powerhan, 〈[https://powerhan.tistory.com/33 daemon 이란 무엇인가?]〉, 《티스토리》, 2009-01-04 | ||
* 카르 kaelina, 〈[https://rrhh234cm.tistory.com/194 ( 기본정리 ) 데몬 프로세스]〉, 《티스토리》, 2016-05-10 | * 카르 kaelina, 〈[https://rrhh234cm.tistory.com/194 ( 기본정리 ) 데몬 프로세스]〉, 《티스토리》, 2016-05-10 | ||
* 민영기TD, 〈[https://blog.ifunfactory.com/2018/02/27/windows-service%EC%99%80-linux-daemon%EC%9D%98-%EB%B9%84%EA%B5%90/ (기술컬럼) Windows service와 Linux daemon의 비교]〉, 《아이펀팩토리 블로그》, 2018-02-27 | * 민영기TD, 〈[https://blog.ifunfactory.com/2018/02/27/windows-service%EC%99%80-linux-daemon%EC%9D%98-%EB%B9%84%EA%B5%90/ (기술컬럼) Windows service와 Linux daemon의 비교]〉, 《아이펀팩토리 블로그》, 2018-02-27 | ||
+ | * 위키백과 - https://ko.wikipedia.org/wiki/Inetd | ||
+ | * 토토로(ikssun), 〈[http://blog.naver.com/PostView.nhn?blogId=ikssun&logNo=150040483850&parentCategoryNo=3&viewDate=¤tPage=1&listtype=0 (Linux) 서비스 운영 방식 (standalone 과 xinetd)]〉, 《네이버 블로그》, 2009-01-08 | ||
+ | * park jong hyun, 〈[http://tmmse.xyz/2017/10/19/daemon/ 데몬 프로세스 (daemon process)]〉, 《개인블로그》, 2017-10-19 | ||
== 같이 보기 == | == 같이 보기 == |
2023년 4월 13일 (목) 00:14 기준 최신판
데몬(daemon)은 데몬은 리눅스 시스템이 처음 가동될 때 실행되는 백그라운드 프로세스이다. 사용자의 요청을 기다리고 있다가 요청이 발생하면 이에 적절히 대응하는 리스너와 같은 역할을 한다. 즉, 메모리에 상주하면서 특정 요청이 오면 즉시 대응할 수 있도록 대기 중인 프로세스를 말한다. 예약된 시간이나 이벤트의 요청이 발생했을 때 지정된 서비스가 실행된다. 영어 발음은 데이먼(deɪmən) 또는 디먼(dimən)에 가깝다.
목차
개요[편집]
데몬은 멀티태스킹 운영체제에서 사용자가 직접적으로 제어하지 않고, 백그라운드에서 돌면서 여러 작업을 하는 프로그램을 말한다. 시스템 로그를 남기는 syslogd 명령어처럼 보통 데몬을 뜻하는 ‘d’를 이름 끝에 달고 있으며, 일반적으로 프로세스로 실행된다.[1] 일반적인 서비스는 각각의 서비스가 사용하는 포트(port)를 관리하는 데몬이 존재한다. 다른 데몬들에게 할당된 포트를 관리하는 특별한 용도의 데몬도 존재한다. 데몬은 부팅 중에 메모리에 로딩되어 컴퓨터가 종료될 때까지 유지된다. 데몬은 서버가 죽을 때까지 자원을 점유하고 있는 형태여서 많은 데몬이 실행된다면 자원 소비가 크다. 마이크로소프트 윈도우의 서비스와 유사하여 실제로 서비스라고 부르기도 한다. 보통 리눅스 시스템의 1번 프로세스인 init(PID=1)이 실행하고, 데몬 프로그램의 명령어는 'd'로 끝난다. (예: ftpd, mysqld, httpd 등)[2]
데몬은 주기적인 서비스 요청을 처리하기 위해 계속 실행되는데, 수집된 요구들을 또다른 프로그램이나 프로세스들이 처리할 수 있도록 적절히 전달한다. 데몬은 대개 부모 프로세스를 갖지 않아 PPID가 1로 세팅되는데, 이는 데몬이 다른 어떤 프로세스의 영향도 받지 않음을 의미한다. 따라서 프로세스 트리에서 init 바로 아래에 위치한다. 데몬이 되는 방법은 일반적으로 자식 프로세스를 포크(fork)하여 생성하고 자식을 분기한 자신을 죽이면서 init이 고아가 된 자식 프로세스를 자기 밑으로 데려가도록 하는 방식이다. 이러한 방법을 ‘포크 오프 앤 다이(fork off and die)’라 부르기도 한다. 시스템은 시동할 때 데몬을 시작하는 경우가 많으며, 이런 데몬들은 네트워크 요청, 하드웨어 동작, 여타 프로그램에 반응하는 기능을 담당하게 된다. 그 밖에도 몇몇 리눅스에 있는 devfsd 처럼 하드웨어 설정이나, 크론(cron)처럼 주기적인 작업을 실행하는 등 기타 다양한 목적으로 사용된다. CD나 DVD에 대한 각종 CD 이미지 파일을 에뮬레이션하여 가상의 CD-ROM 드라이브의 역할을 하게 하게 하며, 시디스페이스와 비슷하다.
어원[편집]
도깨비나 유령을 뜻하는 데몬이란 이름은 매사추세츠 공과대학교의 MAC 프로젝트 프로그래머들이 만든 것이다. 처음 만들어질 때는 맥스웰의 도깨비(Maxwell's demon) 사고 실험에서 맥스웰이 언급한 보이지 않는 곳에서 분자들을 골라주는 일을 하고 있는 유령에서 영감을 얻은 것이었다. 이후 유닉스 시스템은 이 용어를 받아들여 사용했다. 그리스 신화에서도 신들이 관여하지 않는 일을 처리하는 데몬이 등장하는데, 이는 사용자가 직접 신경쓰지 않도록 하면서 백그라운드에서 일을 처리해 주는 데몬의 역할과 맞아 떨어진다. BSD 계열의 운영 체제는 BSD 데몬을 마스코트로 삼았으나, 실제로 BSD의 마스코트는 기독교적 세계에서 그리는 악마의 모습을 귀엽게 만든 것이다. 또한 원래 daemon(데몬)은 두문자어가 아니지만, Disk And Execution MONitor로 두문자어처럼 뜻을 맞추어 말하기도 한다.[1]
특징[편집]
터미널의 부재[편집]
데몬은 터미널 세션과 연결되어 있지 않아 특별한 일이 없는 한 사용자와 상호 대화할 필요 없이 아무도 모르게 실행되어야 하기 때문에 터미널을 가지지 않는다. 대부분의 데몬은 관리자(superuser) 권한으로 실행되며, 컨트롤링(controlling) 터미널을 가진 데몬은 없다. 데몬이 컨트롤링 터미널을 가질 때 두 가지 문제점이 생길 수 있다. 첫 번째는 사용자가 터미널 탈출 문자를 써서 원치 않게 프로세스를 끝내 버리거나 정지시킬 수 있다는 것이다. 두 번째는 원격 터미널 연결이 끊길 경우 원치 않게 프로세스가 종료될 수 있다. 이와 관련해 다음과 같은 관례가 있다.
- 데몬이 잠금 파일을 이용하면, 그 파일은 /var/run 폴더 아래에 저장한다. 여기에 파일을 만들려면 관리자 허가가 필요하다.
- 만약 데몬이 구성 옵션을 제공하면, 그 파일은 /etc 폴더에 저장 구성 옵션 이름은 name.conf이다.
- 데몬이 명령줄에서 시작될 수 있지만 일반적으로 초기화 스크립트 중 하나에서 시작한다.
- 보통 구성 파일이 있다면 시작할 때만 확인한다. 그래서 다시 읽으려면 데몬을 재시작해야 하는데 이게 싫다면 터미널 인터페이스의 연결이 종료되면 받는 시그널인 sighup 시그널을 잡아서 구성 파일을 다시 읽게 한다.[3]
실행 방법[편집]
리눅스에서 데몬을 실행하는 방법은 크게 두 가지가 있다. 혼자 스스로 동작하는 독자형(standalone)방식과 데몬을 관리하는 슈퍼 데몬(super daemon)에 의해 동작하는 방식(xinetd)이 있다. 일반적으로 자주 사용하는 데몬을 독자형 방식으로, 자주 사용하지 않는 데몬을 슈퍼 데몬을 이용한 방식으로 실행한다. 독자형의 경우 시스템의 백그라운드에서 항상 동작하는데, 자주 호출되는 데몬이 아니라면 시스템의 자원을 낭비할 우려가 있다. 독자형 방식은 /etc/init.d/ 나 /etc/rc.d/init.d/에 있는 스크립트 파일로 실행된다. 대표적으로 SSH 서비스를 찾아볼 수 있으며 이는 '해당 서비스 절대 경로 + start/stop/restart' 나 '서비스 이름 + start/stop/restart'로 데몬을 시작하거나 멈추는 등 관리할 수 있다.
슈퍼 데몬에 의한 동작 방식은 평소에는 슈퍼 데몬만 동작하다가 서비스 요청이 오면 슈퍼 데몬이 해당 데몬을 동작시키는 것이다. 따라서 독자형보다는 서비스에 응답하는데 시간이 좀 더 걸릴 수 있지만 자원을 효율적으로 사용한다는 장점이 있다. 슈퍼 데몬을 이용한 방식의 서비스와 독자형 방식의 가장 다른 점은 클라이언트가 서비스를 요청할 때 자동으로 올라간다는 것이다. 슈퍼 데몬에 의해 동작하는 방식은 관리자가 서버를 올리거나 내리거나 할 필요가 없고 항상 메모리 점유하는 게 아니므로 편리하고 메모리 사용에 효율적이다. 만약 리눅스 서버를 웹서버로 사용한다면, 사용자의 웹 서비스 요청이 매우 빈번히 일어날 것이고, 따라서 HTTPS와 같은 웹서버 데몬은 독자형 방식으로 실행된다. 독자형이든 슈퍼 데몬에 의해 동작하는 형태든 데몬이 제대로 동작하지 않으면 시스템이 서비스를 제공할 수 없다.
- 독자형 방식에 해당되는 서비스 : 센드메일(sendmail), 아파치(apache), 마이에스큐엘(MySQL), 네임서버(name server), NFS
- 슈퍼 데몬 방식에 해당되는 서비스 : 텔넷(telnet), POP3, 핑거(finger)[2][4]
종류[편집]
슈퍼 데몬[편집]
데몬의 종류가 늘어나자 이를 관리하기 위한 슈퍼 데몬이 등장했다. 슈퍼 데몬은 커널 2.2버전과 2.4버전이 차이가 있다. 커널 2.2버전(리눅스 6.x) 버전에서는 inetd라는 이름을 사용하였으며, 전체적인 환경 설정은 /etc/inetd.conf에서 통합 관리하였고, 슈퍼 데몬에 속한 데몬들은 TCP 래퍼(Wrapper)라는 프로그램에 의해 접근이 제어되었다. 커널 2.4버전(리눅스 7.x 버전 이후)에서는 xinetd(eXtended internet services daemon)라는 이름의 슈퍼 데몬이 작동되고 환경설정은 /etc/xinetd.conf와 /etc/xinetd.d 디렉토리의 각 서비스 파일에서 관리한다. 슈퍼 데몬은 네트워크 서비스를 제공하는 데몬만 관리한다. 간단히 말해 사용자가 네트워크 서비스를 요청하면 슈퍼 데몬이 이를 받아서 해당하는 서비스 데몬을 동작시키는 것이다. 일반 데몬들처럼 프로세스가 항상 떠있지 않고, 클라이언트의 요청이 있는 경우에만 데몬을 실행시킨다. 응답 시간은 좀 걸리지만 메모리가 절약된다.
init 데몬[편집]
init 데몬은 1번 프로세스이며 프로세스 대부분의 조상 프로세스이다. 대부분의 사용자 레벨 데몬은 프로세스 그룹 리더이자 세션 리더이고 그룹과 세션에 혼자 있는데, 사용자 레벨 데몬의 부모는 init 프로세스이다. pstree 명령으로 프로세스들의 실행 구조를 확인해보면 init가 다른 데몬의 조상임을 다시 한 번 더 알 수 있다.
init-+-acpid |-apache2---7*[apache2] |-atd |-cron |-dbus-daemon |-dhclient |-6*[getty] |-login---bash |-mongod---10*[{mongad}] |-mysqld---16*[{mysql1d}] |-ntpd |-rsyslogd---3*[{rsyslogd}] |-sshd---sshd---bash---pstree |-systemd-logind |-systemd-sdevd |-upstart-file-br |-upstart-socket- ’-spstart-udev-br
커널스레드 데몬[편집]
커널의 일부분을 프로세스처럼 관리하는 데몬을 커널 데몬이라고 한다. 이는 ps 명령으로 확인했을 때 대괄호로 둘러싸여 있는 프로세스들이다. 예전에는 대부분 k로 시작했으나, 요즘은 이를 반드시 준수하지 않는다. 커널 데몬은 대부분 입출력이나 메모리 관리, 디스크 동기화 등을 수행하며, 대체로 PID가 낮은 번호로 할당되어 있다. 일반 프로세스의 조상 데몬이 init라면 커널 데몬을 동작시키는 조상 데몬은 커널스레드 데몬(kthreadd)이다. ps 명령으로 확인해보면 모든 커널 데몬의 PPID가 2번임을 알 수 있다.[5]
UID PID PPID C STIME TTY TIME : CMD root 1 0 0 Apr08 ? 00:00:12 : /sbin/init root 2 0 0 Apr08 ? 00:00:00 : [kthreadd] root 3 2 0 Apr08 ? 00:00:00 : [ksoftirqd/0] root 5 2 0 Apr08 ? 00:00:00 : [kworker/0:0H] root 7 2 0 Apr08 ? 00:00:00 : [kworker/u:0H] root 8 2 0 Apr08 ? 00:00:00 : [migration/0] root 9 2 0 Apr08 ? 00:00:19 : [rcu_preempt] root 10 2 0 Apr08 ? 00:00:00 : [rcu_bh]
inetd 데몬[편집]
inetd(internet service daemon)는 유닉스 시스템에서 돌아가는 슈퍼 서버 데몬으로서 인터넷 서비스들을 제공한다. 각 설정된 서비스들을 위해서, 이것은 연결된 클라이언트들로부터 요청을 리슨한다. 요청들은 적절한 실행 파일을 실행시키는 과정을 통해 서비스되지만, 반향(echo) 같은 간단한 것들은 inetd 스스로 처리한다. 요청에 따라 실행되는 외부 실행 파일들은 단일 또는 다중스레드일 수 있다. 처음 4.3BSD에서 공개되었으며, 일반적으로 /usr/sbin/inetd에 위치한다. 종종 슈퍼 서버로 불리는 inetd는 FTP, POP3 그리고 텔넷 등의 서비스들에서 사용하는 포트들을 리슨 한다. TCP 패킷 또는 UDP 패킷이 특정한 목적 포트 번호로 도착하면, inetd는 적절한 서버 프로그램을 실행해서 연결을 처리하게 한다. 고하중으로 실행되도록 설계되지 않은 서비스들의 경우에 이 방식이 매우 효율적인게, 특정한 서버를 오직 필요할 때만 실행시킬 수 있기 때문이다. 게다가 inetd가 생성한 프로세스의 stdin, stdout 그리고 stderr을 직접 후킹하므로 서비스 프로그램들에서 네트워크 코드가 필요치 않다. 빈번한 트래픽이 발생하는 HTTP나 POP3 서버의 경우에는 트래픽을 직접 받는것이 더 선호된다.[6]
이밖에 리눅스에서 각종 서비스를 제공하기 위한 주요 데몬은 다음과 같다.[5]
데몬 기능 atd 특정 시간에 실행하도록 예약한 명령 실행(at 명령으로 예약) crond 주기적으로 실행하도록 예약한 명령 실행 dhcpd 동적으로 IP 주소를 부여할 수 있도록 하는 서비스 제공 httpd 웹 서비스 제공 IPD 프린트 서비스 제공 nfs 네트워크 파일 시스템 서비스 제공 named DNS 서비스 제공 sendmail 이메일 서비스 제공 smtpd 메일 전송 데몬 popd 기본 편지함 서비스 제공 routed 자동 IP 라우터 테이블 서비스 제공 smb 삼바 서비스 제공 syslogd 로그 기록 서비스 제공 sshd 원격 보안 접속 서비스 제공 in.telnetd 원격 접속 서비스 제공 ftpd 파일 송수신 서비스 제공 ntpd 시간 동기화 서비스 제공
구분[편집]
윈도우에서는 서비스, 리눅스에서는 데몬이라는 용어로 불린다. 데몬은 사용자와의 직접적인 상호작용이 없는 백그라운드에서 동작하는 기능을 관리한다. 필요하면 사용자가 명시적으로 시작하지 않아도 부팅 등 특정 상황에서 자동으로 실행하도록 설정할 수 있다. 작업 실행이 실패했을 때의 재시도 정책 등, 실패 시의 정책을 지정할 수 있으며 이를 위한 기능들을 지원하기도 한다.
윈도우에서 서비스로 실행될 바이너리 파일을 작성하려면, 프로그래밍 단계에서부터 RegisterServiceCtrlHandler 등의 몇몇 서비스 구현을 위한 전용 윈도우 API 함수를 이용한 연동 작업이 필요하다. 리눅스에서는 이러한 별도 작업이 없어도, 실행 파일이라면 무엇이든 데몬으로 동작할 수 있다. 데몬으로 동작할 바이너리를 작성하는 경우 대부분 shell 등으로부터 데몬 프로세스를 분리하기 위해 포크를 호출하지만, nohup 등의 다른 선택지도 있고 포크는 일반적인 시스템콜(system call)일 뿐 데몬만을 지원하기 위한 것도 아니다. 윈도우에서는 실행 파일뿐 아니라 DLL도 서비스로 구동할 수 있다. 실제로 윈도우상에서 기본적으로 제공되는 많은 서비스가 DLL로 만들어져있다. DLL을 바로 프로세스로 만들 수는 없으므로 svchost.exe라는 실행 파일에서 해당 DLL의 진입점(entry point)를 호출하는 방식으로 서비스를 구동한다. 반면 리눅스에서 데몬으로 구동될 수 있는 것은 실행 파일뿐이다. 윈도우에서는 프로세스와 서비스가 1:1 관계가 아니다. DLL을 이용하여 서비스 구동 시, 혹은 실행 파일 작성 시 각 서비스의 진입점 설정 등을 통해 하나의 프로세스에서 둘 이상의 서비스를 실행시킬 수 있다. 리눅스의 데몬은 사실상 백그라운드 프로세스와 동의어다. 둘 이상의 데몬이 하나의 프로세스 하에서 동작하는 경우는 없다.
윈도우에는 서비스 실행만을 위해 존재하는 계정들이 존재한다. 로컬 서비스(local service), 로컬 시스템(local system),네트워크 시스템(network system)이 그것이다. 이 계정들은 관리자(administrator), 로컬 관리자(local administrator)처럼 기본으로 제공되는 계정이지만 별도의 비밀번호를 가지지 않으며, 로그인도 불가능하다. LookupAccountBbyName() 등 몇몇 계정 관리용 API의 대상도 될 수 없다. 윈도우에서 서비스 설정 시, 서비스를 실행할 별도의 계정을 지정하지 않거나 특정 타입만을 지정할 경우, 서비스 실행 시 위의 계정을 이용하여 서비스를 시작한다. 이러한 계정들은 고유의 권한 셋을 가진다. 특히 로컬 시스템 계정의 경우 로컬 어드미니스트레이터 계정과 거의 유상한 권한 셋을 가지지만 어드미니스트레이터는 아니기에 때때로 오작동의 원인이 되기도 한다. 반면 리눅스에서는 데몬 실행만을 위한 계정은 존재하지 않는다. 보안 및 관리의 편리함 등을 위해 데몬 실행 시 별도의 계정 권한을 지정하거나 하는 경우가 많고, 특정 계정의 쉘 로그인을 금지하는 등 제약을 걸 수도 있지만, 데몬 실행만을 위해 특별한 설정을 제공하는 계정은 없다.[7]
각주[편집]
- ↑ 1.0 1.1 데몬 (컴퓨팅) 위키백과 - https://ko.wikipedia.org/wiki/%EB%8D%B0%EB%AA%AC_(%EC%BB%B4%ED%93%A8%ED%8C%85)
- ↑ 2.0 2.1 powerhan, 〈daemon 이란 무엇인가?〉, 《티스토리》, 2009-01-04
- ↑ park jong hyun, 〈데몬 프로세스 (daemon process)〉, 《개인블로그》, 2017-10-19
- ↑ 토토로(ikssun), 〈(Linux) 서비스 운영 방식 (standalone 과 xinetd)〉, 《네이버 블로그》, 2009-01-08
- ↑ 5.0 5.1 카르 kaelina, 〈( 기본정리 ) 데몬 프로세스〉, 《티스토리》, 2016-05-10
- ↑ inetd 위키백과 - https://ko.wikipedia.org/wiki/Inetd
- ↑ 민영기TD, 〈(기술컬럼) Windows service와 Linux daemon의 비교〉, 《아이펀팩토리 블로그》, 2018-02-27
참고자료[편집]
- inetd 위키백과 - https://ko.wikipedia.org/wiki/%EB%8D%B0%EB%AA%AC_(%EC%BB%B4%ED%93%A8%ED%8C%85)
- powerhan, 〈daemon 이란 무엇인가?〉, 《티스토리》, 2009-01-04
- 카르 kaelina, 〈( 기본정리 ) 데몬 프로세스〉, 《티스토리》, 2016-05-10
- 민영기TD, 〈(기술컬럼) Windows service와 Linux daemon의 비교〉, 《아이펀팩토리 블로그》, 2018-02-27
- 위키백과 - https://ko.wikipedia.org/wiki/Inetd
- 토토로(ikssun), 〈(Linux) 서비스 운영 방식 (standalone 과 xinetd)〉, 《네이버 블로그》, 2009-01-08
- park jong hyun, 〈데몬 프로세스 (daemon process)〉, 《개인블로그》, 2017-10-19
같이 보기[편집]