[기술컬럼] Windows service와 Linux daemon의 비교

Windows의 시작은 MS-DOS 상에서 동작하는 일종의 GUI Interface이다. 즉 Windows는 데스크톱에서 사용하기 위해 만들어진 개인용 OS가 그 기원이다. 반면 리눅스는 유닉스 계열에서 파생된 OS로, 태생부터 서버용 OS라 할 수 있다. 이후 Windows는 Windows NT 등을 발표하며 서버용 OS 시장에 진입했고, 반대로 리눅스는 Ubuntu Desktop과 같은 데스크톱 지원을 목표로 하는 배포판들이 늘어나는 등, 각자의 영역을 넓히고 있다. 이러한 확장 과정에서 타 OS의 장점을 흡수, 발전해왔기에 두 OS에서 유사해 보이는 개념들을 찾기란 어렵지 않다.

하지만 개념적으로는 유사하더라도, 시작점이 다르기에 사용법 등에서 큰 차이를 보이는 것들도 많다. 가장 대표적인 예 중 하나가 서버 관리 등의 용도로 사용되는, 백그라운드 프로세스 관리 기능이다. Windows에서는 service, linux에서는 daemon이라는 용어로 불린다.

이 둘은 만들어진 목적이나 제공하는 기능 면에서는 유사하다. 사용자와의 직접적인 interaction 이 없는, 백그라운드에서 동작하는 기능을 관리한다. 필요하다면 사용자가 명시적으로 시작하지 않아도 부팅 등 특정 상황에서 자동으로 실행하도록 설정할 수 있다. 작업 실행이 실패했을 때의 재시도 정책 등, 실패 시의 정책을 지정할 수 있으며 이를 위한 기능들을 지원하기도 한다.

이러한 기능적인 유사성 때문에, 대부분 이 두 기능은 거의 같은 것으로 취급된다. Windows와 관련한 논의에서 daemon이라고 언급하면 대부분 service라고 이해한다. 몇몇 Linux 배포판에서는 service라는 이름의 daemon 관리 도구를 기본으로 제공하기에 이제는 linux에서도 service라는 단어가 생소하지만은 않다. 하지만 양쪽을 실제로 구현, 사용해보면 의외로 많은 차이점을 발견할 수 있다.

● Windows에서 서비스로 실행될 바이너리 파일을 작성하려면, 프로그래밍 단계에서부터 RegisterServiceCtrlHandler등의 몇몇 Service 구현을 위한 전용 Windows API 함수를 이용한 연동 작업이 필요하다. (nssm 등의 몇몇 우회책도 있으나, 말 그대로 우회책에 불과하다.)
Linux 에서는 이러한 별도 작업이 없어도, 실행 파일이라면 무엇이든 daemon으로 동작할 수 있다. daemon으로 동작할 바이너리를 작성하는 경우 대부분 shell 등으로부터 daemon 프로세스를 분리하기 위해 fork를 호출하지만, nohup 등의 (권장하는 방식은 아니지만) 다른 선택지도 있고 fork는 일반적인 system call일 뿐 daemon만을 지원하기 위한 것도 아니다. damon() 등 몇몇 daemon 작성 시 사용할 수 있는 함수도 있지만, 이 역시 필수는 아니다.

● Windows에서는 실행 파일 뿐 아니라 DLL도 service로 구동할 수 있다. 실제로 Windows 상에서 기본적으로 제공되는 많은 service가 DLL로 만들어져 있다. DLL을 바로 프로세스로 만들 수는 없으므로 svchost.exe 라는 실행 파일에서 해당 DLL의 entry point 를 호출하는 방식으로 서비스를 구동한다. Windows에서 기본으로 제공하는 서비스들의 상당수가 이러한 형태로 구동된다.
반면 Linux에서 daemon으로 구동될 수 있는 것은 실행 파일뿐이다.

● Windows에서는 프로세스와 service가 1:1 관계가 아니다. 위에서 언급한 DLL을 이용하여 서비스 구동 시, 혹은 실행 파일 작성 시 각 service의 진입점(entry point) 설정 등을 통해 하나의 프로세스에서 둘 이상의 서비스를 실행시킬 수 있다.
Linux의 daemon은 사실상 background process와 동의어이다. 둘 이상의 daemon이 하나의 프로세스 하에서 동작하는 경우는 없다.

민영기TD하나의 process 하에서 4개의 service가 실행되고 있다.

● Windows에는 service 실행만을 위해 존재하는 계정들이 존재한다. LocalService, LocalSystem, NetoworkSystem이 그것이다. 이 계정 들은 administrator/local administrator처럼 기본으로 제공되는 계정이지만 별도의 password를 가지지 않으며, 로그인도 불가능하다. LookupAccountByName() 등 몇몇 계정 관리용 API의 대상도 될 수 없다. Windows에서 서비스 설정 시, 서비스를 실행할 별도의 계정을 지정하지 않거나 특정 타입만을 지정할 경우, 서비스 실행 시 위의 계정을 이용하여 서비스를 시작한다. 이러한 계정들은 고유의 권한 셋을 가진다. 특히 LocalSystem 계정의 경우 local administrator 계정과 ‘거의’ 유사한 권한 셋을 가지지만 administrator는 아니기에 때때로 오동작의 원인이 되기도 한다.
반면 linux에서는 daemon 실행만을 위한 계정은 존재하지 않는다. 보안 및 관리의 편리함 등을 위해 daemon 실행 시 별도의 계정 권한을 지정하거나 하는 경우가 많고, 특정 계정의 shell 로그인을 금지하는 등 제약을 걸 수도 있지만, daemon 실행만을 위해 특별한 설정을 제공하는 계정은 없다.

이러한 차이들은 두 OS의 기능, 구조 등의 차이가 원인이기도 하지만, 서두에서 언급했던, 역사의 차이에서도 기인하는 것 같다. Windows가 service를 OS의 본질적 기능이라기보다는 특정 ‘기능’으로 취급하는 반면, linux에서는 daemon을 그냥 일반적인 프로세스의 일종으로 취급한다. 데스크톱에서는 사용자가 임의로 작성한 기능이 background에서, 특정 사용자가 log out 한 후에도 동작해야 하는 경우는 드물다. 따라서 Windows 에서의 service는 단순 프로세스 관리가 아닌, 말 그대로 background service 관리만을 위해 특화된 기능을 ‘추가’해야만 하는 상황이었을 것이다. 반면 Unix의 영향을 많이 받은 linux에서는 특정 사용자가 구현한 기능을, 해당 사용자의 login 여부와 관계없이 background에서 오랜 시간 실행하는 것은 특이한 요구사항이 아니었을 것이다.

Windows에서만 서버를 운영하다가 처음 Linux 환경으로 옮겨왔을 때, 혹은 반대의 경우에 흔히 마주치는 문제 중 하나는 서버 관리 시 흔히 사용되는 Windows service와 damon 관리의 차이에서 발생하는 혼선이다. 기능상으로는 매우 유사하나 실제로 사용해 보려면 생성 및 등록부터 권한 등의 관리까지 여러 면에서 차이가 있기에 시행착오를 겪는 일이 잦다. 이 글이 이러한 시행착오를 겪고 있는 분들에게 도움이 되었으면 한다.

아이펀팩토리 민영기 테크니컬 디렉터

답글 남기기

댓글을 게시하려면 다음의 방법 중 하나를 사용하여 로그인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중

This site uses Akismet to reduce spam. Learn how your comment data is processed.