DAEMON

Arnau Sanchez arnau en ehas.org
Mar Abr 25 16:45:59 CEST 2006


Yo uso una función similar a la que explican en la recipe a la que 
aludía Carlos, aunque con algunos pequeños añadidos para que escriba el 
fichero de pid.

Por las referencias que hace a "/dev/null" la función sólo corre en 
Linux. Como es natural, hay que invocarla antes de entrar en el bucle 
infinito.

arnau

#########################
def create_daemon(pidfile = ""):
    try:
        pid = os.fork()
        if pid > 0: sys.exit(0)
    except OSError, e:
        sys.stderr.write("fork #1 failed: (%d) %s\n" % (e.errno, 
e.strerror))
        sys.exit(1)
       
    # Decouple from parent environment.
    os.chdir("/")
    os.umask(0)
    os.setsid()
   
    # Do second fork.
    try:
        pid = os.fork()
        if pid > 0: sys.exit(0) # Exit second parent.
    except OSError, e:
        sys.stderr.write("fork #2 failed: (%d) %s\n" % (e.errno, 
e.strerror))
        sys.exit(1)
   
    # Open file descriptors and print start message
    si = file("/dev/null", 'r')
    so = file("/dev/null", 'w')
   
    # Redirect standard file descriptors.
    os.dup2(si.fileno(), sys.stdin.fileno())
    os.dup2(so.fileno(), sys.stdout.fileno())
    os.dup2(so.fileno(), sys.stderr.fileno())

    if pidfile:
        try:
            fd = open(pidfile, "w")
        except IOError:
            print "Error opening pidfile for writing:", pidfile
            sys.exit(1)
        fd.write(str(os.getpid()) + "\n")
        fd.close()



Alex wrote:

>Hola a todos, tengo un script que escucha las peticiones a un puerto
>determinado, tiene un while que hace que no termine la ejecución.
>Lo que me passa es que al ejecutarlo ya no puedo usar la consola sin hacer
>un control+c.
>Cómo podria solucionar eso sin hacer un nohup con job.
>
>#!/usr/bin/python
>
>import os
>from socket import *
>myHost = ''
>myPort = 2009
>pidfile = "/tmp/gestionaisp.pid"
>usuariUid = 2002
>usuariGid = 2001
>
>s = socket(AF_INET, SOCK_STREAM)    # create a TCP socket
>s.bind((myHost, myPort))            # bind it to the server port
>s.listen(5)                         # allow 5 simultaneous
>
>
>#->Alex
>pid = str( os.getpid() )
>os.system("echo "+ pid + " > "+ pidfile)
>os.setgid(usuariGid)
>os.setuid(usuariUid)
>#-<Alex
>
>while 1:
>    # wait for next client to connect
>    connection, address = s.accept() # connection is a new socket
>    while 1:
>        data = connection.recv(1024) # receive up to 1K bytes
>        if data:
>            #Aqui hauriem de passar les dades al binary de php
>            # i esperar la resposta
>#           os.system('mkdir hola')
>#           resposta = os.popen('ls -n').read()
>            connection.send(  "as"  )
>        else:
>            break
>
>connection.close()              # close socket
>_______________________________________________
>Python-es mailing list
>Python-es en aditel.org
>http://listas.aditel.org/listinfo/python-es
>
>.
>
>  
>




Más información sobre la lista de distribución Python-es