python 스 크 립 트 를 Liux 데 몬 으로 실행 합 니 다.
데 몬 의 가장 중요 한 기능 은 배경 에서 실행 하 는 것 입 니 다.이 점 에서 도스 의 상주 메모리 프로그램 인 TSR 은 이와 유사 하 다.그 다음으로 데 몬 은 실행 전의 환경 과 격 리 되 어야 합 니 다.이 환경 들 은 닫 히 지 않 은 파일 묘사 서술 자 를 포함 하고 있다.제어 단말기.세 션 과 프로 세 스 그룹, 작업 폴 더, 파일 마스크 생 성 등.
linux 데 몬 과 일반 프로 세 스 의 차이
Python 데 몬 프로그램 작성 방향
코드 구현
여기 서 나 는 이런 방식 으로 실현 되 어 나중에 직접 사용 하기에 편리 하 다.
우선 로그 기록 기 를 만 듭 니 다.
def creat_handler():
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
# logs/log-- &
# , 、 、
file_log_handler = RotatingFileHandler(LOG_FILE_PATH, maxBytes=1024 * 1024 * 100, backupCount=10)
#
formatter = logging.Formatter('%(levelname)s %(filename)s:%(lineno)d - %(asctime)s - %(name)s - %(message)s')
#
file_log_handler.setFormatter(formatter)
logger.addHandler(file_log_handler)
return logger
데 몬 생 성 클래스 정의
class Daemon(object):
"""python linux """
def __init__(self, pidfile, base_path, stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
# , stdin='/dev/stdin', stdout='/dev/stdout', stderr='/dev/stderr', root 。
self.stdin = stdin
self.stdout = stdout
self.stderr = stderr
self.pidfile = pidfile
self.base_path = base_path
def _daemonize(self):
try:
pid = os.fork() # fork, ,
if pid > 0:
sys.exit(0) #
except OSError as e:
logger.error('fork #1 failed: %d (%s)
' % (e.errno, e.strerror))
sys.exit(1)
os.chdir("/") #
os.setsid() #
os.umask(0) #
try:
pid = os.fork() # fork,
if pid > 0:
sys.exit(0)
except OSError as e:
logger.error('fork #2 failed: %d (%s)
' % (e.errno, e.strerror))
sys.exit(1)
#
sys.stdout.flush()
sys.stderr.flush()
si = open(self.stdin, 'r')
so = open(self.stdout, 'a+')
se = open(self.stderr, 'a+')
os.dup2(si.fileno(), sys.stdin.fileno())
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())
# , pid
atexit.register(self.delpid)
pid = str(os.getpid())
open(self.pidfile, 'w+').write('%s
' % pid)
def delpid(self):
os.remove(self.pidfile)
def start(self):
# pid
try:
pf = open(self.pidfile, 'r')
pid = int(pf.read().strip())
pf.close()
except IOError:
pid = None
if pid:
message = 'pidfile %s already exist. Daemon already running!
'
logger.warning(message % self.pidfile)
sys.exit(message % self.pidfile)
#
self._daemonize()
self._run()
def stop(self):
# pid pid
try:
pf = open(self.pidfile, 'r')
pid = int(pf.read().strip())
pf.close()
except IOError:
pid = None
if not pid: #
message = 'pidfile %s does not exist. Daemon not running!
'
logger.error(message % self.pidfile)
return
#
try:
while 1:
os.kill(pid, SIGTERM)
time.sleep(0.1)
except OSError as err:
err = str(err)
if err.find('No such process') > 0:
if os.path.exists(self.pidfile):
os.remove(self.pidfile)
else:
sys.exit(str(err))
def restart(self):
self.stop()
self.start()
def _run(self):
""" """
pass
사용 예시
Daemon 계승, run 방법 다시 쓰기
class MyDaemon(Daemon):
def _run(self):
while True:
os.system("echo 'hello world' >> a.txt")
time.sleep(1)
쓰기 시작 방식
if __name__ == "__main__":
daemon = MyDaemon('/tmp/process.pid', BASE_PATH, stdout='/tmp/stdout.log')
if len(sys.argv) == 2:
if 'start' == sys.argv[1]:
daemon.start()
elif 'stop' == sys.argv[1]:
daemon.stop()
elif 'restart' == sys.argv[1]:
daemon.restart()
else:
print('unknown command')
sys.exit(2)
sys.exit(0)
else:
print('usage: %s start|stop|restart' % sys.argv[0])
sys.exit(2)
시작, 정지, 재 부팅
python xxx.py start
python xxx.py stop
python xxx.py restart
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.