Heim  >  Artikel  >  Backend-Entwicklung  >  Python-Daemon-Daemon-Implementierung

Python-Daemon-Daemon-Implementierung

高洛峰
高洛峰Original
2017-02-10 09:10:091459Durchsuche

Wenn Sie ein Serverprogramm schreiben und Strg+C das Terminal beendet oder schließt, wird das Serverprogramm beendet. Deshalb habe ich darüber nachgedacht, dieses Programm zu einem Daemon-Prozess zu machen, wie httpd, der immer im Backend läuft, aber das wird nicht der Fall sein Vom Terminal betroffen.

Der Daemon-Prozess wird auf Englisch Daemon genannt, wie httpd, mysqld, und der letzte Buchstabe d bedeutet eigentlich Daemon.

Schritte zum Schreiben des Daemon-Prozesses:

1. Verzweigen Sie den untergeordneten Prozess und dann wird der übergeordnete Prozess beendet. Zu diesem Zeitpunkt wird der untergeordnete Prozess vom Init-Prozess übernommen.
2. Ändern Sie das Arbeitsverzeichnis des untergeordneten Prozesses, erstellen Sie eine neue Prozesskombination und eine neue Sitzung und ändern Sie die umask.
3. Der untergeordnete Prozess gabelt einen Prozess erneut. Dieser Prozess kann als Enkelprozess bezeichnet werden, und dann wird der untergeordnete Prozess beendet.
4. Leiten Sie den Standardeingabestream, den Standardausgabestream und den Standardfehler des Enkelprozesses nach /dev/null um.
Führen Sie die oben genannten 4 Schritte aus, dann wird der letzte Enkelprozess als Daemon-Prozess bezeichnet Lesen Sie zuerst den Code und analysieren Sie später die Gründe für die nächsten Schritte.

#!/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. Verzweigen Sie den untergeordneten Prozess und der übergeordnete Prozess wird beendet.
Wenn wir das Serverprogramm ausführen, stellen wir normalerweise eine Verbindung zum Server her über das Terminal. Nach der Verbindung werden sowohl das Terminal als auch die Shell geladen. Der Shell-Prozess ist der Unterprozess des Terminal-Prozesses In dieser Shell-Umgebung sind alle Unterprozesse des Shell-Prozesses vom Shell-Prozess betroffen. Nach dem Verzweigen des untergeordneten Prozesses wird der übergeordnete Prozess beendet , wird der resultierende untergeordnete Prozess vom Init-Prozess übernommen und somit von der Terminalsteuerung getrennt.
2. Ändern Sie das Arbeitsverzeichnis des untergeordneten Prozesses
Wenn der untergeordnete Prozess erstellt wird, erbt er das Arbeitsverzeichnis des übergeordneten Prozesses. Wenn sich das ausgeführte Programm auf dem USB-Flash-Laufwerk befindet, kann dies nicht der Fall sein deinstalliert werden.
3. Erstellen Sie eine neue Sitzung
Nach der Verwendung von setsid wird der untergeordnete Prozess zum ersten Prozess der neuen Sitzung, der untergeordnete Prozess wird zum Leiterprozess der neuen Prozessgruppe und der untergeordnete Prozess übernimmt keine Kontrolle das Terminal.
4. Ändern Sie umask.
Da umask alle Berechtigungen blockiert, können Sie Berechtigungsprobleme beim Lesen und Schreiben von Dateien vermeiden.
5. Der untergeordnete Prozess wird beendet Nach den oben genannten Schritten wird der untergeordnete Prozess zum neuen Prozessgruppenchef und kann sich erneut bewerben, um das Terminal zu öffnen. Um dieses Problem zu vermeiden, verzweigen Sie den untergeordneten Prozess.
6. Leiten Sie den Standardeingabestrom um , Standard-Ausgabestream und Standard des Enkelprozesses. Der Fehler fließt nach /dev/null
Da es sich um einen Daemon-Prozess handelt und vom Terminal getrennt wurde, dann der Standard-Eingabestream, der Standard-Eingabestream und der Standardfehler stream sind bedeutungslos, daher werden sie alle nach /dev/null umgeleitet, was bedeutet:

Lassen Sie uns dieses Programm ausführen und die Wirkung sehen

python daemon守护进程实现

Wie Sie auf dem Bild oben sehen können, wurde dieses Skriptprogramm in den Hintergrund gestellt und kann nur mit der Killall-Methode beendet werden.

Als Nächstes werfen wir einen Blick auf die aufgezeichneten Protokolle

python daemon守护进程实现

Weitere Artikel zur Implementierung von Python-Daemon-Daemons finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn