"daemon"프로세스는 터미널 세션에 속하지 않고 백그라운드로 동작하게 되어 있다 많은 시스템
서비스들은 daemon 프로세스 들이다. 예를 들어 네트웍 inetd라든지 lpd라든지..
단지 프로그램을 백그라운드로 수행 시킨다고 오랜동안 이렇게 수행되는 daemon프로세스가 되지
는 않는다. 프로그램이 시작할 때 터미널 세션으로 부터 분리시키는 것이 중요하다. 또한 전통적
인 daemon프로세스가 시작하는 방법은 rc script에서 시작되는데 보통 자신이 실행되면 바로 백
그라운드로 실행 시킨다.
다음에 daemon이 되는 순서를 적는다
1. fork()를 수행하고 부모프로세스는 exit한다. 이것은 제어를 명령 라인으로 옮기게 된다. 이렇
게 함으로써 새로운 프로세스는 그룹 리더가 되는 것을 보증 받게 된다. 다음 단계는 setsid()인
데 이것은 여러분이 그룹 리더 프로세스가 아닐 때 발생 된다.
2. 프로세스 그룹, 그리고 세션 그룹 리더가 되기 위해 setsid()를 수행한다. 제어 터미널이 세션
으로 이루어 져 있기 때문에 그리고 이 새로운 세션이 제어 터미널을 아직 획득하지 않았다면 이
때 프로그램은 제어 터미널이 없는 상태가 되는데 이것이 daemon프로세스를 위한 환경이 된다.
3. fork()를 다시 수행한다. 그러면 세션 그룹 리더인 부모 프로세스는 exit할 수 있다. 이것은
non-session그룹 리더로서 다시는 제어 터미널을 획득 하지 않아도 된다는 것을 의미한다.
4. 프로세스가 어떤 특정 디렉토리에 있지 않도록 하기 위해 chdir("/")을 수행하라. 만약 시스
템 관리자가 파일 시스템을 unmount할 수 없다면 이유는 여러분이 위의 명령을 제대로 하지 않
았기 때문이다.
같은거지만 우리의 데몬 프로세스가 특정 중요한 위치의 디렉토리를 홈디렉토리로 하기 위해
chdir을 수행 하기도 한다.
5. 우리가 write하는 어떤 것에 대해서도 퍼미션을 완전히 제어 할 수 있도록umask(0)을 수행
하라. 왜냐면 daemon이 상속받은 umask가 어떤 것인지 확신할 수 없기 때문이다.
[다음 부터는 선택 사항이다]
6. close()로 파일 디스크립터 0번과 1, 2번을 닫아라. 이렇게 하면 부모 프로세스로 부터 상속
받은 프로그램의 표준 입력과 출력, 에러 등을 닫게 된다. 왜냐면 우리는 이 프로그램으로 어떠한
입력 출력이 redirect되어 들어오게 될지 알 수 없기 때문에 미리 닫아두게 되는 것이다. 많은
daemon프로세스들이 최대 파일과 프로세스 open 개수인 _SC_OPEN_MAX와 _SC_OPEN_MAX
를 제한 하기 위해 sysconf()를 사용한다는 것을 주지하라. 그리고 반복문을 통해 모든 가능한 파
일 디스크립터를 닫아라.(물론 이것을 해야할지 말아야 할지는 미리 정해야 한다.) 왜냐면 데몬
프로세스가 열수 있는 파일수는 제한되어 있기 때문이다.
7. stdin과 stdout, stderr을 위한 새로운 파일 디스크립터를 만들어라. 비록 이들을 사용하지 않
을 거라고 해도 이렇게 하는 것이 좋다. 만약 여러분들이 logfile을 두게 된다면 여러분들은
stderr와 stdout을 만들게 될 것이고 /dev/null을 stdin으로 열게 될 것이다. 선택적으로 여러분은
/dev/console을 stderr과 stdout으로 그리고 /dev/null을 stdin 또는 다른 조합으로 daemon의 성격
에 따라서 열 수 있다.
만약 여러분의 프로세스가 inetd에 의해 시작 되는 거라며 위의 대부분이 필요가 없다. 이러한 경
우에 stdin, stdout, stderr은 모두 여러분이 네트웍 연결과 fork()그리고 세션이 조작되어서는 안
된다(inetd를 혼란스럽게 하지 않기 위해). 이때는 chdir()과 umask()만 사용가능한 것으로 남게
된다.
"daemon"프로세스는 터미널 세션에 속하지 않고 백그라운드로 동작하게
"daemon"프로세스는 터미널 세션에 속하지 않고 백그라운드로 동작하게 되어 있다 많은 시스템
서비스들은 daemon 프로세스 들이다. 예를 들어 네트웍 inetd라든지 lpd라든지..
단지 프로그램을 백그라운드로 수행 시킨다고 오랜동안 이렇게 수행되는 daemon프로세스가 되지
는 않는다. 프로그램이 시작할 때 터미널 세션으로 부터 분리시키는 것이 중요하다. 또한 전통적
인 daemon프로세스가 시작하는 방법은 rc script에서 시작되는데 보통 자신이 실행되면 바로 백
그라운드로 실행 시킨다.
다음에 daemon이 되는 순서를 적는다
1. fork()를 수행하고 부모프로세스는 exit한다. 이것은 제어를 명령 라인으로 옮기게 된다. 이렇
게 함으로써 새로운 프로세스는 그룹 리더가 되는 것을 보증 받게 된다. 다음 단계는 setsid()인
데 이것은 여러분이 그룹 리더 프로세스가 아닐 때 발생 된다.
2. 프로세스 그룹, 그리고 세션 그룹 리더가 되기 위해 setsid()를 수행한다. 제어 터미널이 세션
으로 이루어 져 있기 때문에 그리고 이 새로운 세션이 제어 터미널을 아직 획득하지 않았다면 이
때 프로그램은 제어 터미널이 없는 상태가 되는데 이것이 daemon프로세스를 위한 환경이 된다.
3. fork()를 다시 수행한다. 그러면 세션 그룹 리더인 부모 프로세스는 exit할 수 있다. 이것은
non-session그룹 리더로서 다시는 제어 터미널을 획득 하지 않아도 된다는 것을 의미한다.
4. 프로세스가 어떤 특정 디렉토리에 있지 않도록 하기 위해 chdir("/")을 수행하라. 만약 시스
템 관리자가 파일 시스템을 unmount할 수 없다면 이유는 여러분이 위의 명령을 제대로 하지 않
았기 때문이다.
같은거지만 우리의 데몬 프로세스가 특정 중요한 위치의 디렉토리를 홈디렉토리로 하기 위해
chdir을 수행 하기도 한다.
5. 우리가 write하는 어떤 것에 대해서도 퍼미션을 완전히 제어 할 수 있도록umask(0)을 수행
하라. 왜냐면 daemon이 상속받은 umask가 어떤 것인지 확신할 수 없기 때문이다.
[다음 부터는 선택 사항이다]
6. close()로 파일 디스크립터 0번과 1, 2번을 닫아라. 이렇게 하면 부모 프로세스로 부터 상속
받은 프로그램의 표준 입력과 출력, 에러 등을 닫게 된다. 왜냐면 우리는 이 프로그램으로 어떠한
입력 출력이 redirect되어 들어오게 될지 알 수 없기 때문에 미리 닫아두게 되는 것이다. 많은
daemon프로세스들이 최대 파일과 프로세스 open 개수인 _SC_OPEN_MAX와 _SC_OPEN_MAX
를 제한 하기 위해 sysconf()를 사용한다는 것을 주지하라. 그리고 반복문을 통해 모든 가능한 파
일 디스크립터를 닫아라.(물론 이것을 해야할지 말아야 할지는 미리 정해야 한다.) 왜냐면 데몬
프로세스가 열수 있는 파일수는 제한되어 있기 때문이다.
7. stdin과 stdout, stderr을 위한 새로운 파일 디스크립터를 만들어라. 비록 이들을 사용하지 않
을 거라고 해도 이렇게 하는 것이 좋다. 만약 여러분들이 logfile을 두게 된다면 여러분들은
stderr와 stdout을 만들게 될 것이고 /dev/null을 stdin으로 열게 될 것이다. 선택적으로 여러분은
/dev/console을 stderr과 stdout으로 그리고 /dev/null을 stdin 또는 다른 조합으로 daemon의 성격
에 따라서 열 수 있다.
만약 여러분의 프로세스가 inetd에 의해 시작 되는 거라며 위의 대부분이 필요가 없다. 이러한 경
우에 stdin, stdout, stderr은 모두 여러분이 네트웍 연결과 fork()그리고 세션이 조작되어서는 안
된다(inetd를 혼란스럽게 하지 않기 위해). 이때는 chdir()과 umask()만 사용가능한 것으로 남게
된다.
0x2B | ~0x2B
- Hamlet
윗글은 안창선님의 홈페이지에 있는 unixcfaq 에서 인용한것 입니다.
윗글은 안창선님의 홈페이지에 있는 unixcfaq 에서 인용한것 입니다.
http://people.kldp.org/~kabin/doc/unixcfaq1.txt
0x2B | ~0x2B
- Hamlet
[참고도서] Linux Programming by Example
Linux Programming by Example 이 책에 필요한 내용이 있을겁니다.
따로 Daemon 이라는 챕터가 있거든요....
서점 원서코너에서 가볍게 읽으시면 좋을것 같습니다. :D
Re: 제가 만든 프로그램을 daemon 으로 서비스로 등록할려면 어
이 분이 말씀하신것이.. 제가 보기에는 약간 다른걸 말씀하시는 것 같은데요?
물론 프로그램을 daemon으로 만드는 것이야 위에서 말씀들 하셨으니까, 서비스 형식으로 사용하는 것에 대해 답변해야 할 듯 한데요..
예를들어, 평상시에는 프로세스 데몬이 떠있지 않다가 특정 포트로 들어왔을 때(/etc/services 에 등록한 포트번호) 그 데몬을 구동해서 동작시키고, 프로세스가 동작을 마치면 다시 sleep.
이런 모델을 말씀하시는거 아닌가요?
쿨럭 -_- 아님 말구요..
xinetd
http://www.wowlinux.co.kr/information/freshmanview.html?id=85&view=1
위 url에 원하시는게 있을 듯 싶습니다.
daemon은 윗분들 말씀처럼 만들면 되고
xinetd에 등록하는 문제는 위 url을 참고 하시면 될듯..
light my fire
댓글 달기