以下是测试demo,如有错误还请指正,运行错误还望自行解决,谢谢!
启动方法:
1. 前台运行:python main.py (config.py->options->debug->'True')
2. 后台运行:python main.py start (config.py->options->debug->'False')
main.py
#coding=utf-8
#!/usr/bin/python
import os
import daemon
import logging
import signal
import time
from config import options
from daemon import runner
from logging import Formatter
from logging.handlers import RotatingFileHandler
from logging.handlers import TimedRotatingFileHandler
# logging.basicConfig(level=logging.DEBUG) #打开调试模式
DISPATCH_VERSION = 'V1-20190812'
root_path = os.path.dirname(os.path.abspath(__file__))
def SetupLogger():
FORMAT = '%(asctime)-15s %(levelname)-8s [%(filename)-16s L: %(lineno)d] %(message)s'
formatter = Formatter(fmt=FORMAT)
logger = logging.getLogger()
if options.get('debug',False):
handler = logging.StreamHandler()
logger.setLevel(logging.INFO) #CRITICAL:5 ERROR:4 WARNING:3 INFO:2 DEBUG:1 NOTSET:0
else:
log_dir = os.path.join(root_path,'log')
if not os.path.exists(log_dir):
os.mkdir(log_dir)
handler = RotatingFileHandler('%s/main.log' % log_dir, maxBytes=10 * 1024 * 1024, backupCount=1)
logger.setLevel(logging.WARNING)
handler.setFormatter(formatter)
logger.addHandler(handler)
return handler
def signal_handler(signum, frame):
logging.info('PID:[%d] exit!' % os.getpid())
os.kill(os.getpid(),signal.SIGKILL)
def CtrlSignalExit():
signal.signal(signal.SIGINT, signal_handler)
class App:
def __init__(self):
logging.info('App Verson:[%s]', (DISPATCH_VERSION))
self.stdin_path = '/dev/null'
self.stdout_path = '/dev/null'
self.stderr_path = '/dev/null'
self.pidfile_path = '%s/amin.pid' % root_path
self.pidfile_timeout = 5
self.svcs = []
def run(self):
from HelloWorld import HelloWorld
try:
logging.info('App start')
HW = HelloWorld()
HW.start()
while True:
time.sleep(1)
logging.info('App exit')
except Exception as e:
logging.error('Exception: {0}'.format(e))
if __name__ == '__main__':
handler = SetupLogger()
app = App()
if options.get('debug',False):
CtrlSignalExit()
app.run()
else:
daemon_runner = runner.DaemonRunner(app)
daemon_runner.daemon_context.files_preserve = [handler.stream]
daemon_runner.do_action()
HelloWorld.py
#coding=utf-8
import logging
import time
import threading
class HelloWorld(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
logging.info('HelloWorld Init Success!')
def run(self):
while True:
logging.info('HelloWorld!')
time.sleep(1)
config.py
#coding=utf-8
options = {
'debug': False, #True 前台运行
}