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.
Volta para CookBook.