👻 리눅스의 보이지 않는 조력자: 데몬(Daemon)과 유닛(Unit)

리눅스 시스템을 운영하다 보면 수많은 '데몬'들이 배경에서 움직입니다. 그리고 우리는 systemd라는 도구로 이들을 다루죠. 이 둘은 어떤 관계이며, 왜 이런 독특한 이름이 붙었을까요? 코드 한 줄에 철학이 있듯, 리눅스 시스템의 구조에도 명확한 설계 의도가 담겨 있습니다.

linux_daemon_and_systemd_concept
systemd가 여러 daemon에 작업지시를 내리는 이미지

1. 왜 '데몬(Daemon)'인가? : 보이지 않는 곳의 영리한 존재

'데몬'이라는 이름은 그리스 신화에서 신과 인간 사이에서 보이지 않게 도움을 주는 '수호신(Daemons)' 에서 유래했습니다. 이후 물리학자 맥스웰이 제안한 '맥스웰의 도깨비(Maxwell’s Demon)' 가설을 거쳐, 1963년 MIT의 개발자들이 "사용자의 개입 없이 배경에서 스스로 알아서 판단하고 일하는 프로그램" 에 이 이름을 붙였습니다.

  • 본질: 데몬은 사용자와 직접 대화하지 않습니다. 터미널을 끄더라도 메모리에 상주하며 네트워크 요청을 기다리거나 시스템 상태를 감시하는 '백그라운드 프로세스' 그 자체를 의미합니다.

2. systemd도 데몬인가? : "데몬을 관리하는 마스터 데몬"

네, 맞습니다. 이름 끝에 붙은 'd' 가 그 증거입니다. systemd는 리눅스 커널이 부팅된 후 가장 먼저 실행되는 1번 프로세스(PID 1) 이자, 다른 모든 데몬을 부리고 관리하는 '마스터 데몬' 입니다.

그 전까지 리눅스는 데몬들을 관리하는 방식이 중구난방이었습니다. systemd는 이 혼란을 잠재우고 모든 시스템 요소를 표준화된 규격으로 관리하기 위해 등장했습니다. 여기서 등장하는 표준 규격이 바로 '유닛(Unit)' 입니다.

3. 유닛(Unit): 데몬을 움직이는 '표준 작업 지시서'

데몬이 실제 일을 수행하는 '실체'라면, 유닛은 그 실체를 어떻게 다룰지 적어놓은 '작업 지시서' 입니다. systemd라는 마스터 데몬은 우리가 작성한 이 지시서(Unit)를 읽고, 그 내용에 따라 각 데몬을 깨우거나 잠재웁니다.

  • 의도의 명확성: 만약 유닛이라는 규격이 없다면, 개발자마다 데몬을 실행하는 코드를 제각각 짰을 것입니다. 하지만 유닛(예: .service 파일)이라는 표준 지시서 덕분에, 우리는 "어떤 환경에서, 어떤 순서로, 문제가 생기면 어떻게 재시작할지" 를 매우 정교하고 견고하게 정의할 수 있습니다.
  • 유연한 확장성: 유닛은 데몬(Service)만을 위한 게 아닙니다. 특정 시간에 일을 시키는 '타이머', 장치를 연결하는 '마운트' 등 리눅스의 모든 요소를 동일한 '작업 지시서' 형식으로 처리합니다. 덕분에 시스템 전체를 하나의 일관된 논리로 확장할 수 있습니다.

4. 한눈에 보는 관계도

구분 데몬 (Daemon) systemd 유닛 (Unit)
정체 메모리에서 실제로 돌아가는 프로세스 시스템 설정을 기록한 명세서 파일
역할 백그라운드에서 실제 기능 수행 데몬의 실행 조건과 동작 방식 정의
비유 현장에서 묵묵히 일하는 일꾼 일꾼이 보고 따르는 작업 지시서

정리하자면:
systemd라는 마스터 데몬은 유닛(작업 지시서) 을 읽어 들여, 수많은 데몬(일꾼) 들이 정해진 규칙대로 정확하게 움직이도록 지휘합니다.

5. 일꾼의 정체는 다양하다: '데몬'과 '서비스 유닛' 제대로 구분하기

우리가 흔히 "서비스를 올린다"고 말할 때, 실제로 배경에서 뛰고 있는 일꾼(데몬)의 모습은 단 한 가지가 아닙니다. 어떤 언어로 만들었든, 어떤 형태든 백그라운드에서 돌아가기만 하면 모두 데몬이 될 수 있기 때문입니다.

다양한 일꾼의 형태:

  • 스크립트 데몬: 직접 작성한 Django나 FastAPI 같은 파이썬 코드를 유닛으로 등록하면, python3라는 실행기를 통해 돌아가는 파이썬 데몬이 됩니다.

  • 바이너리 데몬: C나 Go 언어로 미리 컴파일된 Nginx, sshd 같은 것들은 그 자체가 실행 파일 형태인 데몬입니다.

  • 쉘 스크립트 데몬: 심지어 간단한 .sh 파일도 무한 루프를 돌며 배경에서 동작하고 있다면 훌륭한 일꾼(데몬)입니다.

서비스 유닛은 '연결 고리'입니다:

엄밀히 말해 sshd나 여러분의 파이썬 스크립트 그 자체가 곧 '서비스'인 것은 아닙니다. 그것들은 단지 데몬(일꾼)일 뿐입니다.
우리가 /etc/systemd/system/ 디렉토리에 직접 만들거나, 패키지가 설치될 때 자동으로 등록되는 .service 파일(유닛)이 바로 그 일꾼을 시스템의 정식 구성원으로 등록해주는 작업 지시서입니다.

결론

데몬은 "배경에서 일하는 프로그램"이라는 상태를 말하고, 서비스 유닛은 그 데몬을 systemd라는 마스터가 제어할 수 있게 규격화한 명세서를 말합니다. 이 지시서가 있기에 systemd는 일꾼의 정체가 파이썬인지, 바이너리인지 상관없이 똑같은 방식으로 명령을 내릴 수 있는 것입니다.

어떤가요? 저는 리눅스를 메인으로 사용한지 4~5년 정도 되었는데, 이 둘의 개념을 깨달았다고 생각해도 정작 누군가에게 설명할 때는 굉장히 어려웠습니다. 아마도 저는 알고 있다고 생각해도 사실 완전히 이해하지 못했던 것이라고 생각합니다. 이제서야 드디어 저만의 언어로 정의를 내리고 정리를 해보니 머릿속이 명확해진 기분이듭니다.

역시 글쓰기는 재미있습니다. 시간은 걸려도 글을 쓰다보면 머리속이 정리되니까요.