associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

DaemonizadorDeProgramas

Receita: Daemonizador de Programas

Um daemon (ou dæmon) é um processo que roda desconectado de um terminal, com sua entrada e saídas padrões direcionadas para algo inofensivo (/dev/null neste caso), este processo roda em segundo plano (background) e geralmente é responsável por algum processo cliente/servidor.

Código

   1 # daemon.py
   2 """Robusto daemonizador de programas.
   3 
   4 Baseado em
   5   http://starship.python.net/crew/jjkunce/python/daemonize.py
   6   http://www.noah.org/python/daemonize.py
   7 """
   8 
   9 import sys
  10 import os
  11 
  12 try:
  13     MAXFD = os.sysconf('SC_OPEN_MAX')
  14 except:
  15     MAXFD = 256
  16 
  17 def daemonize(stdin='/dev/null', stdout='/dev/null', stderr='/dev/null',
  18               newhome='/', closeall=1):
  19     try:
  20         pid = os.fork()
  21         if pid > 0:
  22             sys.exit(0)
  23     except OSError, e:
  24         sys.stderr.write("o primeiro fork falhou: (%d) %s\n" %
  25                          (e.errno, e.errstr))
  26         sys.exit(1)
  27 
  28     os.setsid()
  29     os.chdir(newhome)
  30     os.umask(0)
  31 
  32     try:
  33         pid = os.fork()
  34         if pid > 0:
  35             sys.exit(0)
  36     except OSError, e:
  37         sys.stderr.write("o segundo fork falhou: (%d), %s\n" %
  38                          (e.errno, e.errstr))
  39         sys.exit(1)
  40 
  41     fin = open(stdin, 'r')
  42     fout = open(stdout, 'a+')
  43     ferr = open(stderr, 'a+', 0)
  44     os.dup2(fin.fileno(), sys.stdin.fileno())
  45     os.dup2(fout.fileno(), sys.stdout.fileno())
  46     os.dup2(ferr.fileno(), sys.stderr.fileno())
  47 
  48     if closeall:
  49         for i in range(3, MAXFD):
  50             try:
  51                 os.close(i)
  52             except:
  53                 pass
  54 
  55 def test():
  56     import time
  57     daemonize()
  58     while 1:
  59         time.sleep(10)
  60 
  61 if __name__ == '__main__':
  62     test()

Exemplo de uso

Neste exemplo, o teste.py funcionará como um daemon que grava de 10 em 10 segundos a data atual no arquivo /var/tmp/teste.dat. Ao executar este script o mesmo parecerá que terminou de executar, mas na verdade estará rodando em segundo plano. Procure o processo com ps axu | grep teste.py. Acompanhe sua execução com tail -f /var/tmp/teste.dat.

   1 #!/usr/bin/env python
   2 # teste.py
   3 
   4 import time
   5 import daemon
   6 
   7 if __name__ == '__main__':
   8     daemon.daemonize()
   9     f = open('/var/tmp/teste.dat', 'a')
  10     while 1:
  11         f.write(time.asctime() + '\n')
  12         f.flush()
  13         time.sleep(10)

Volta para CookBook.


RudaMoura.