[UNIX] Daemon

Daemon은 백그라운드에서 수행되며 제어 테이널이 없는 프로세스다. Daemon은 일반적으로 부팅 시에 시작되며 root 혹은 다른 특수한 사용자 계정(apache나 postfix같은) 권한으로 실행되어 시슽메 수준의 작업을 처리한다. crond, sshd처럼 편의를 위해 Daemon의 이름은 d로 끝나는 경우가 많은데 이는 필수 조건도 아니며 보편적인 것도 아니다.
( The name of a daemon often ends in d (as in crond and sshd), but this is not required or even universal.)

Daemon 유례. Daemon이라는 이름은 물리학자 James Clerk Maxwell의 사고 실험인 Maxwell demon(맥스웰의 도깨비)에서 차용한 것이다. 다이몬(Daemon)은 그리스 신화에 등장하는 인간계와 신계 사이에 존재하는 힘과 신성한 지식을 가진 초자연적인 존재이기도 하다. 유대교와 크리스트교의 마귀(Demon)와 다르게 그리스 신화의 다이몬은 사악한 존재가 아니다. 오히려 신을 도와 올림푸스 산에 살고 있는 인간들이 스스로 하기 싫어하는 일을 도맡아 처리하는 역할로 묘사된다. 유닉스 데몬 역시, 사용자가 포어그라운드에서 처리하기를 꺼리는 작업을 수행한다.

데몬은 두 가지 일반적인 요구사항이 있는데 반드시 init 프로세스의 자식 프로세스여야 하며 터미널과 연결되어 있으면 안된다.

일반적으로 다음 과정을 통해 Daemon이 될 수 있다.
1) fork()를 호출해서 데몬이 될 새로운 프로세스를 생성한다.
2) 부모 프로세스에서 exit()를 호출해서 데몬 프로세스의 부모 프로세스를 종료한다. 이렇게 해서 데몬 프로세스가 프로세스 그룹의 리더가 되지 않도록 한다. 특히 마지막 조건은 다음 단계를 완수하기 위한 필수 조건이다.
3) setsid()를 호출하여 데몬이 새로운 프로세스 그룹과 세션의 리더가 되도록 한다. 이렇게 해서 데몬 프로세스가 제어 터미널에 연관되지 않도록 한다(프로세스가 막 새로운 세션을 생성했으며 제어 터미널을 할당하지 않았기 때문이다)
4) chdir()를 사용하여 작업 디렉터리를 루트 디렉터리로 변경한다. 이렇게 하는 이유는 부모로부터 상속받는 작업 디렉터리가 파일시스템상에 어떤 위치든 가능하기 때문이다. Daemon은 시스템이 켜져 있는 동안 계속 실행되는 경향이 있으므로 임의의 디렉터리가 계속 열린 상태로 방치되어 관리자가 그 디렉터리를 포함하는 파일시스템을 마운트 해제할 수 없게 되는 상황을 회피하기 위함이다.
5) 모든 파일 디스크립터를 닫는다. 열린 파일 디스크립터를 상속받아서 의식하지도 못하고 열린 채로 두기를 원하지 않을 것이다.

6) 0, 1, 2번 파일 디스크립터(각각 표준 입력, 출력, 에러)를 열고 /dev/null로 리다이렉트한다.

댓글

가장 많이 본 글