>  기사  >  백엔드 개발  >  Python 데몬 데몬 구현

Python 데몬 데몬 구현

高洛峰
高洛峰원래의
2017-02-10 09:10:091458검색

서버 프로그램을 작성할 때 Ctrl+C를 누르거나 터미널을 닫으면 서버 프로그램이 종료되기 때문에 이 프로그램을 httpd와 같이 항상 백엔드에서 실행되는 데몬 프로세스로 만들까 생각했습니다. t 단말기의 영향을 받습니다.

데몬 프로세스는 httpd, mysqld와 같이 영어로 daemon이라고 부르며, 마지막 문자 d는 실제로 데몬을 의미합니다.

데몬 프로세스 작성 단계:

1. 하위 프로세스를 포크한 후 상위 프로세스가 종료됩니다. 이때 하위 프로세스는 init 프로세스에 의해 인수됩니다.
2. 하위 프로세스의 작업 디렉터리를 수정하고, 새 프로세스 조합과 새 세션을 만들고, umask를 수정합니다.
3. 자식 프로세스는 프로세스를 다시 분기한 후 손자 프로세스라고 부를 수 있으며, 그런 다음 자식 프로세스가 종료됩니다.
4. 손자 프로세스의 표준 입력 스트림, 표준 출력 스트림 및 표준 오류를 /dev/null로 리디렉션
위의 4단계를 완료하면 마지막 손자 프로세스를 데몬 프로세스라고 합니다. 먼저 코드를 작성하고 나중에 다음 단계의 이유를 분석하세요.

#!/usr/bin/env python
#coding=utf8
def createDaemon():
  import os, sys, time
  #产生子进程,而后父进程退出
  try:
    pid = os.fork()
    if pid > 0:sys.exit(0)
  except OSError,error:
    print 'fork'
    sys.exit(1)
 
  #修改子进程工作目录
  os.chdir("/")
  #创建新的会话,子进程成为会话的首进程
  os.setsid()
  #修改工作目录的umask
  os.umask(0)
 
  #创建孙子进程,而后子进程退出
  try:
    pid = os.fork()
    if pid > 0:
      print "Daemon PID %d"%pid
      sys.exit(0)
  except OSError,error:
    print "fork"
    sys.exit(1)
  run()
 
 
def ping():
  import os
  os.system('ping www.baidu.com >/dev/nul')
 
def run():
  while True:
    import time,threading
    fd = open('/home/ping.log', 'a')
    fd.write("start time---------:%s\n"%time.ctime())
    fd.flush()
    t=threading.Thread(target=ping,args=())
    t.start()
    time.sleep(3)
    fd.write("end of time--------:%s\n"%time.ctime())
    fd.flush()
  fd.close()
 
if __name__=='__main__':
  createDaemon()

1. 자식 프로세스를 Fork하고 부모 프로세스가 종료됩니다.
보통 서버 프로그램을 실행할 때 다음을 통해 서버에 연결합니다. 터미널에 성공적으로 연결되면 쉘 환경이 로드됩니다. 쉘 프로세스는 터미널 프로세스의 하위 프로세스로, ps 명령을 통해 쉽게 확인할 수 있습니다. 이 쉘 환경에서 실행되는 모든 하위 프로세스는 당연히 쉘 프로세스의 영향을 받게 됩니다. 쉘 프로세스의 경우 부모 프로세스가 종료되더라도 마찬가지입니다. 완료되면 생성된 하위 프로세스가 init 프로세스에 의해 인계되어 터미널 제어에서 벗어납니다.
2. 자식 프로세스의 작업 디렉터리 수정
자식 프로세스가 생성되면, 실행된 프로그램이 U 디스크에 있으면 U 디스크를 제거할 수 없습니다. .
3. 새 세션 만들기
setsid를 사용한 후 하위 프로세스는 새 세션의 첫 번째 프로세스가 되고 하위 프로세스는 새 프로세스 그룹의 리더 프로세스가 되며 하위 프로세스는 제어되지 않습니다. 터미널.
4. umask 수정
umask는 권한을 차단하므로 모든 것을 0으로 설정하면 파일을 읽고 쓸 때 권한 문제를 피할 수 있습니다.
5. 하위 프로세스가 종료됩니다. 위의 몇 단계 후에 하위 프로세스가 새 프로세스 그룹 보스가 되며 터미널 열기를 다시 신청할 수 있습니다. 이 문제를 방지하려면 손자 프로세스를 포크하세요.
6. 표준 입력 스트림을 리디렉션합니다. , 표준 출력 스트림, 손자 프로세스의 표준 오류는 /dev/null
데몬 프로세스이고 터미널에서 분리되었기 때문에 표준 입력 스트림, 표준 입력 스트림, 표준 오류로 흐릅니다. 스트림은 의미가 없으므로 모두 /dev/null로 리디렉션됩니다. 이는

이 프로그램을 실행하여 효과를 확인하자

python daemon守护进程实现

를 의미합니다. 위 사진에서 볼 수 있듯이 이 스크립트 프로그램은 백그라운드에 넣어져 있고 Killall 방식으로만 종료가 가능합니다,

다음으로 기록된 로그를 살펴보겠습니다

python daemon守护进程实现

파이썬 데몬 데몬 구현과 관련된 더 많은 글은 PHP 중국어 홈페이지를 주목해주세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.