Python으로 데몬(daemon) 프로세스 생성하기
데몬 프로세스는 백그라운드 모드로 실행되면서 사용자의 요청이 있을 때마다 적절한 작업을 수행해주는 프로세스를 말한다. 데몬이 단순한 백그라운드 프로세스와 구분되는 것이 데몬의 경우에는 부모 프로세스가 1번 init으로 세팅되어 있고 터미널을 가지고 있지 않다는 점이다. 따라서 다음의 과정을 따르면 POSIX 인터페이스를 이용해서 데몬을 작성할 수 있다 [1].
이 코드에서 첫번째 fork()는 부모 프로세스를 죽이고 새로운 세션을 생성한다. 두번째 fork()는 새로운 세션에서 데몬이 세션리더가 되는 것을 피하기 위해서 사용된다. os.setsid()에 의해서 데몬은 세션리더가 되는데, 세션리더가 터미널의 파일 기술자(file descriptor)를 열게 된다면 그 열린 터미널이 현재 세션의 터미널이 된다. 터미널을 가지면 데몬이 아니기 때문에 이런 경우를 안전하게 피하기 위해서 두번째 fork()를 사용해서 데몬 프로세스가 세션리더가 되는 것을 방지한다 [2].
References
[1] C로 간단한 데몬(daemon)제작하기, http://data.oss.or.kr/sw/view.html?sort=&num=649&page=1
[2] Fork a daemon process on Unix, http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66012
- fork()로 자식프로세스를 생성하고 부모 프로세스를 종료한다.
- 자식 프로세스에서 새로운 세션을 생성한다.
def Daemon():
try:
pid = os.fork()
if pid > 0: sys.exit(0)
except OSError:
print >>sys.stderr, "fork() failed"
sys.exit(1)
os.setsid()
os.umask(0)
try:
pid = os.fork()
if pid > 0: sys.exit(0)
except OSError:
print >>sys.stderr, "second fork failed"
sys.exit(1)
# REDIRECT STDOUT/STDERR TO OUT/ERR FILES #
out_log = file("log/out",'a+')
err_log = file("log/error",'a+',0)
os.dup2(out_log.fileno(), sys.stdout.fileno())
os.dup2(err_log.fileno(), sys.stderr.fileno())
# DO WHAT YOU WANT HERE #
try:
pid = os.fork()
if pid > 0: sys.exit(0)
except OSError:
print >>sys.stderr, "fork() failed"
sys.exit(1)
os.setsid()
os.umask(0)
try:
pid = os.fork()
if pid > 0: sys.exit(0)
except OSError:
print >>sys.stderr, "second fork failed"
sys.exit(1)
# REDIRECT STDOUT/STDERR TO OUT/ERR FILES #
out_log = file("log/out",'a+')
err_log = file("log/error",'a+',0)
os.dup2(out_log.fileno(), sys.stdout.fileno())
os.dup2(err_log.fileno(), sys.stderr.fileno())
# DO WHAT YOU WANT HERE #
이 코드에서 첫번째 fork()는 부모 프로세스를 죽이고 새로운 세션을 생성한다. 두번째 fork()는 새로운 세션에서 데몬이 세션리더가 되는 것을 피하기 위해서 사용된다. os.setsid()에 의해서 데몬은 세션리더가 되는데, 세션리더가 터미널의 파일 기술자(file descriptor)를 열게 된다면 그 열린 터미널이 현재 세션의 터미널이 된다. 터미널을 가지면 데몬이 아니기 때문에 이런 경우를 안전하게 피하기 위해서 두번째 fork()를 사용해서 데몬 프로세스가 세션리더가 되는 것을 방지한다 [2].
References
[1] C로 간단한 데몬(daemon)제작하기, http://data.oss.or.kr/sw/view.html?sort=&num=649&page=1
[2] Fork a daemon process on Unix, http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66012
TRACKBACK ADDRESS :: http://bionote.net/tt/blna999/trackback/98

데몬의 개념을 잡는데 많은 도움이 되었습니다.
감사합니다. 복받으세요 ^^