Implémentation du démon Python

高洛峰
Libérer: 2017-02-10 09:10:09
original
1520 Les gens l'ont consulté

Si vous écrivez un programme serveur, si ctrl c quitte ou ferme le terminal, alors le programme serveur se fermera, j'ai donc pensé à faire de ce programme un processus démon, comme httpd, toujours exécuté sur le backend sans être affecté par le terminal impact.

Le processus démon est appelé démon en anglais, comme httpd, mysqld, et la dernière lettre d signifie en fait démon.

Étapes d'écriture du processus démon :

1. Forkez le processus enfant, puis le processus parent se termine. À ce moment, le processus enfant sera repris par le processus d'initialisation.
2. Modifiez le répertoire de travail du processus enfant, créez une nouvelle combinaison de processus et une nouvelle session, et modifiez l'umask.
3. Le processus enfant bifurque à nouveau un processus. Ce processus peut être appelé processus petit-fils, puis le processus enfant se termine.
4. Redirigez le flux d'entrée standard, le flux de sortie standard et l'erreur standard du processus petit-enfant vers /dev/null
Terminez les 4 étapes ci-dessus, puis le processus petit-enfant final est appelé un processus démon. le code en premier et analysez les raisons des étapes suivantes plus tard.

#!/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()
Copier après la connexion

1. Forkez le processus enfant et le processus parent se termine
Habituellement, lorsque nous exécutons le programme serveur, nous nous connectons au serveur. via le terminal. Succès Après la connexion, l'environnement shell sera chargé. Le terminal et le shell sont tous deux des processus. Le processus shell est le sous-processus du processus terminal. Vous pouvez facilement le voir via la commande ps. dans cet environnement shell, tous les sous-processus du processus shell seront naturellement affectés par le processus shell. Après avoir créé le processus enfant dans le programme, le processus parent se termine, même si le processus parent est terminé. , le processus enfant résultant sera repris par le processus init et sera donc séparé du contrôle du terminal.
2. Modifier le répertoire de travail du processus enfant
Lorsque le processus enfant est créé, il héritera du répertoire de travail du processus parent Si le programme exécuté est dans la clé USB, la clé USB ne peut pas. être désinstallé.
3. Créez une nouvelle session
Après avoir utilisé setsid, le processus enfant deviendra le premier processus de la nouvelle session, le processus enfant deviendra le processus leader du nouveau groupe de processus et le processus enfant ne contrôlera pas. la borne.
4. Modifiez umask
Puisque umask bloquera les autorisations, définissez tout sur 0, ce qui peut éviter les problèmes d'autorisation lors de la lecture et de l'écriture de fichiers
Forkez le processus petit-enfant et le processus enfant se termine
. Après ce qui précède Après quelques étapes, le processus enfant deviendra le nouveau chef du groupe de processus et pourra réappliquer pour ouvrir le terminal. Afin d'éviter ce problème, forkez le processus petit-enfant,
6. Redirigez le flux d'entrée standard. , le flux de sortie standard et le standard du processus petit-enfant. L'erreur circule vers /dev/null
Parce qu'il s'agit d'un processus démon et qu'il a été séparé du terminal, puis le flux d'entrée standard, le flux d'entrée standard et l'erreur standard. stream n'ont aucun sens, ils sont donc tous redirigés vers /dev/null, ce qui est supprimé. Cela signifie

Exécutons ce programme et voyons l'effet

python daemon守护进程实现

. Comme vous pouvez le voir sur l'image ci-dessus, ce programme de script a été mis en arrière-plan et ne peut être utilisé que par la méthode Killall pour y mettre fin,
Ensuite, jetons un coup d'œil aux journaux enregistrés

python daemon守护进程实现

Pour plus d'articles liés à l'implémentation du démon python, veuillez faire attention au site Web PHP chinois !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal