자세한 설명은 생략한다. log 모듈은 troot 블로그에 있다.
stderr가 현재 /dev/null에 붙어있는데 주석처리하고 로깅하면 된다.
#-*- coding: utf-8 -*-
import os
import sys
import signal
from log import log, WARN, INFO
def _sig_stop(signum, frame):
log(INFO, 'SIGSTOP, 프로세스를 종료합니다. pid = ' + str(os.getpid()))
exit()
g_pid_file_name = ''
def daemon_init(pid_filename = 'getTc.pid', deploy_mode = 'stop'):
global g_pid_filename
g_pid_filename = pid_filename
try:
with open(pid_filename) as pid_file:
try:
pid = pid_file.readline()
log(INFO, '이전 프로세스가 존재하여 종료합니다. pid = ' + pid)
os.kill(int(pid), signal.SIGKILL)
except:
log(INFO, '이전 프로세스 제거에 실패하였습니다. 점검을 요합니다')
try:
os.remove(pid_filename)
except:
log(INFO, 'pid 파일 제거에 실패하였습니다. 점검을 요합니다')
except:
log(INFO, 'pid 파일이 없으므로 바로 기동합니다')
if deploy_mode == 'stop':
exit(0)
def daemon_start():
global g_pid_filname
pid = os.fork()
if pid > 0:
exit(0)
else:
os.setsid()
os.umask(0)
pid = os.fork()
if pid > 0:
exit(0)
else:
sys.stdout.flush()
sys.stderr.flush()
if 1:
si = open(os.devnull, 'r')
so = open(os.devnull, 'a+')
se = open(os.devnull, 'a+')
os.dup2(si.fileno(), sys.stdin.fileno())
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())
pid = str(os.getpid())
with open(g_pid_filename, 'w') as pid_file:
pid_file.write(pid)
signal.signal(signal.SIGINT, _sig_stop)
signal.signal(signal.SIGTERM, _sig_stop)
log(INFO, '데몬 모드로 실행합니다. pid = ' + pid)
def main():
from env import env_init
env_init()
daemon_init()
daemon_start()
from time import sleep
from env import env_init
while True:
print 'kk'
sleep(1)
if __name__ == '__main__':
main()