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