[Linux] 데몬(daemon)

seunghyun·2024년 1월 24일
0

💻

목록 보기
15/15


도깨비나 유령을 뜻하는 데몬(daemon)이란 이름은 MIT의 MAC 프로젝트 프로그래머들이 만든 것이다. 처음 만들어질 때는 맥스웰의 도깨비 사고 실험에서 맥스웰이 언급한, 보이지 않는 곳에서 분자들을 골라주는 일을 하고 있는 유령에서 영감을 얻은 것이었다.


데몬(daemon)이란?

백그라운드 프로세스 중에서 부모프로세스(PPID)가 1 혹은 다른 데몬프로세스인 프로세스를 말한다.

데몬은 오래 사는 프로세스를 말하고, 보통은 시스템이 부팅될 때 같이 켜지고 종료될 때 같이 끝난다. Controlling 터미널이 없어서 background 에서 돈다 라고 표현한다.

유닉스(리눅스)에서는 데몬을 앞에 나타나지 않고 사용자가 모르게 뒤에서 시스템을 위해 움직이는 프로그램을 말한다.

리눅스에서 서버 역할을 하는 프로그램들을 대부분 데몬에 속한다.
데몬은 지속적인 서비스 요청을 처리하기 위해 백그라운드에서 계속 실행되는 프로세스를 말하며, 보통은 프로세스 뒤에 d 문자가 붙어있다.
유닉스(리눅스 포함) 운영체제에서 이름이 “d”로 끝나는 프로세스들을 예로 들자면 inetd, httpd, nfsd, sshd, namedlpd 등이 있다.

데몬의 특징

데몬은 대부분 부모 프로세스를 갖지 않는다. 즉 PPID1이다.
일반적으로 데몬 프로세스를 실행한 뒤 자신을 죽이면서 고아 프로세스가 된 데몬을 자동으로 init 프로세스가 데려가는 방식을 실행하며, 프로세스 트리에서 init 프로세스 바로 아래 위치하게 된다. 이러한 방법을 ‘fork off and die’라 부르기도 한다.

보통 부팅 시에 실행되어 하드웨어 설정이나 스케줄링 등 다양한 목적으로 사용된다.

데몬들도 하나의 프로그램이므로 설치되는 위치가 다르고, 효율적인 관리를 위해 부팅되는 런레벨에 따라 동작 유무가 결정된다. 부팅에 관련된 정보는 /etc/rc.d에 위치하고 있고, 관련 데몬은 init.d 디렉터리에서 확인할 수 있다.

지속적인 서비스를 위한 데몬이 실행되는 방법에는 총 두 가지가 있다.

  • standalone 방식: 부팅 시에 실행되어 메모리에 계속 상주하면서 들어오는 요청을 처리한다. 웹이나 이메일 등 빈번하게 요청이 들어오는 경우 대부분 standalone 방식으로 동작되며, ps 명령(현재 실행 중인 프로세스 확인)을 통해 확인할 수 있다.
  • inetd 방식: 메모리에 계속 상주하는 것이 아닌, 클라이언트의 요청이 들어왔을 때 프로세스가 실행한다. 이후 작업이 끝나면 자동으로 프로세스가 종료된다. 자동으로 실행, 종료되므로 메모리 관리가 용이하다.

foreground, background

사실 실제 화면을 보지 않고 백그라운드 프로세스를 이해하는 것은 매우 어렵다. 이는 눈을 가린채 코끼리 다리를 만지게 하면서 코끼리의 생김새를 이해하라는 것과 같다.

백그라운드 프로세스가 있다면 그 반대의 개념인 포그라운드(Foreground) 프로세스가 있다는 것도 유추가능하다. 이 두 프로세스의 차이를 이해하면 데몬 프로세스가 무엇인지 아주 쉽게 이해할 수 있다.

포그라운드 프로세스는 사용자와의 대화창구인 표준입출력장치 즉 터미널과 키보드(tty 혹은 pts로 표현되는)을 통해 대화한다. 하지만 백그라운드 프로세스는 적어도 입력장치에 대해 터미널과의 관계를 끊은 모든 프로세스를 의미한다. 즉 사용자에게 무언가를 키보드를 통해 전달받지 않고 스스로 동작하는 프로세스가 바로 백그라운드 프로세스이다.

예시

이미지 참고

ssh 192.168.100.100 까지는 PC의 Windows에서 실행된 cmd의 화면이다. 윈도의 cmd는 유닉스(리눅스)와는 다르지만 화면에 C:>와 같이 표현되는 프롬프트를 표시하고 키보드로 입력을 받는다. 즉 키보드 입력과 화면 출력을 통해 사용자와 대화한다. 따라서 cmd는 포그라운드 프로세스다.

그리고 다음 라인의 taeho@192.168.100.100 ‘s password : 은 앞 라인에서 cmd가 사용자가 입력한 ssh 명령을 해석해 PC에 있는 ssh 명령을 실행하고 아규먼트로 전달받은 192.168.100.100 IP로 ssh 접속을 시도하여 서버에서 실행중인 ssh 데몬과 세션을 맺은 다음 ssh 데몬이 사용자에게 보여주기를 원하는 내용을 ssh 명령이 전달받아 화면에 출력한 내용이다.
즉 ssh 명령도 화면에 sshd로 부터 전달받은 내용을 표시하고 키보드를 통해 사용자가 입력한 비밀번호를 서버의 sshd에 전달하므로 포그라운드 프로세스다.
그리고 비밀번호를 입력한 뒤 화면에는 $로 표현되는 리눅스의 쉘이 표시되었다. 여기서부터 유닉스(리눅스) 운영체제에 대한 이해가 필요하다.

sshd가 $ 를 보여주고 사용자가 명령을 입력하기를 기다리므로 sshd가 포그라운드 프로세스가 아니냐고 반문할 수 있다. 결론은 sshd는 포그라운드 프로세스가 아니다.

왜냐하면 sshd의 역할은 비밀번호를 입력받아 비밀번호가 맞는지를 확인하고 passwd 파일에서 해당 계정에게 할당된 bash 를 실행시키고 뒤로 물러나 있기 때문이다. 즉 화면에 표시된 $ 는 sshd가 보여준 것이 아니라 sshd가 실행시킨 bash가 보여주는 것이기 때문이다. 즉 sshd는 사용자에게 키보드로 부터 직접 입력을 받지 않으며 직접 무언가를 지시할 수 없다. sshd 프로세스는 사용자와 직접 대화하지 않는 백그라운드 프로세스임을 알 수 있다.

정리해보자

리눅스에서 명령어는 fork 방식으로 실행된다. 이는 새로운 메모리를 할당해서 실행되므로 기존 프로세스가 그대로 유지된다.
exec 방식으로 명령어를 실행했을 경우, 메모리를 새로 할당하지 않고 기존 프로세스에 덮어씌우는 방식이다.

fork와 exec 방식으로 실행된 프로세스들이 실행되는 위치에는 '포그라운드'와 '백그라운드' 두 가지가 있다.

포그라운드는 프로세스가 실행되는 도중에는 다른 작업을 할 수 없어 프로세스가 종료될 때까지 기다려야 한다. 실행되는 과정은 출력되지 않으며, 그저 언제 끝날지 모를 프로세스를 마냥 기다려야 하는 불편함이 있다.

백그라운드 프로세스는 눈에 보이지 않게 뒤에서 실행되는 프로세스를 의미하며, 실행하는 도중에도 작업자는 다른 작업을 진행할 수 있어 멀티태스킹 작업을 할 수 있게 만들어준다.
일반적으로 로그 처리, 스케줄링, 모니터링 등의 프로그램에 사용한다.

대표적인 데몬 프로세스 (웹서버)

가장 대표적인 데몬 프로세스는 웹서버 데몬이다. 웹서버 데몬 프로세스는 서버에서 터미널을 통해 실행될 수 있지만 tty 또는 pts 등 터미널을 통해 사용자와 대화할 필요가 없기 때문에 백그라운드 프로세스로 생성하도록 만들어져 있다.

즉 프로그램의 소스 안에서 fork() 함수를 통해 자식을 생성하고 부모는 죽는다. 그리고 생성된 자식은 부모프로세스를 1 (init) 로 변경한 뒤 실제로 서비스를 수행할 자식(손자에 해당)프로세스를 여러개 fork() 한다. 그리고 그 자식(손자) 프로세스들은 계정을 setuid() 함수를 이용해 웹서버가 실행되도록 설정된 계정으로 바꾼다. (실제로는 과정이 조금 다를 수도 있음)

그 결과 다음과 같이 프로세스가 생성된다.

httpd(8064)는 PPID(부모프로세스ID)가 1 이다. 그리고 실행된 계정은 root 이다. 이는 웹서버를 root 계정에서 실행시키기 때문이다. 그 이유는 TCP 1024 포트 이하는 root 에서만 Binding이 가능하기 때문이다.

그리고 PPID를 8064로 갖는 httpd 프로세스가 5개가 있고 그 계정은 실행계정이 apache 임을 알 수 있다. root가 아니고 apache로 변경한 이유는 보안상의 이유다. PPID가 1 인 httpd는 실제로 웹브라우저의 요청을 처리하는 웹서버 데몬이 아니다. 사용자의 접속이 많아 웹서버 대몬이 더 이상 사용자의 접속 요청을 처리할 수 없을 때 자식을 포크(fork)해주는 역할만 수행한다. 실제로 웹브라우저의 요청을 처리하는 웹서버 데몬은 apache 계정이 실행계정으로 되어 있는 나머지 5개의 웹서버 데몬이다.

이는 만약 root 계정으로 실행중인 웹서버가 해킹을 당하는 상황을 가정하면 해커는 곧바로 서버의 관리자 권한인 root 권한을 획득하는 것이 된다. 이런 상황은 매우 치명적인 상황을 유발할 수 있기 때문에 실제 서비스를 수행하는 웹서버 데몬은 apache 계정으로 실행하도록 만들어져 있는 것이다.

이렇게 PPID가 1 인 httpd 프로세스와 PPID가 1인 프로세스를 PPID로 갖는 5개의 httpd 프로세스가 바로 데몬(daemon) 프로세스다.

이 데몬프로세스들은 로그인한 ssh 세션에서 exit로 로그아웃 하더라도 종료되지 않고 웹 서비스를 제공하게 된다.

프로그램을 백그라운드로 작업하기

프로그램을 백그라운드로 작업하는 방법에는 크게 두 가지가 있다.

  • 명령어 맨 뒷줄에 & 기호를 추가하기
  • 작업 중인 프로세스를 Ctrl+Z (대기모드) 전환 후 bg 명령 사용

백그라운드에서 수행 중인 프로세스는 jobs 명령으로 확인할 수 있으며, 작업 번호와 기호로 관리할 수 있다.

[1] 기호는 작업 번호를 말한다. 다수의 프로세스가 백그라운드에서 작업하는 도중에 fg % 작업번호 명령을 이용해서 포어그라운드로 전환할 수 있다.

+기호로 표시된 프로세스가 주로 처리되고 있는 작업을 말한다.
그리고 -기호는 다음 작업 예정을 뜻한다.


🔗 Reference

0개의 댓글