Heim > Artikel > Backend-Entwicklung > Python-Daemon-Daemon-Implementierung
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:
Als Nächstes werfen wir einen Blick auf die aufgezeichneten Protokolle