In der Daemon-Klasse Beispiel, die ich implementieren, wird Deskriptoren Umleitung verwendet.Datei-Deskriptoren Umleitung ist fest
sys.stdout.flush()
sys.stderr.flush()
si = file(self.stdin, 'r')
so = file(self.stdout, 'a+')
se = file(self.stderr, 'a+', 0)
os.dup2(si.fileno(), sys.stdin.fileno())
os.dup2(so.fileno(), sys.stdout.fileno()) # This line doesn't work
os.dup2(se.fileno(), sys.stderr.fileno())
os.dup2(so.fileno(), sys.stdout.fileno())
funktioniert nicht. Es verursacht keine Fehler. Der Code nach dieser Zeile wird nicht ausgeführt.
ich vereinfachte dieses Beispiel auf die Klasse nur der Problembereich enthält:
class Deamon(object):
def __init__(self, pidfile, stdout='/dev/null'):
self.pidfile = pidfile
self.stdout = stdout
def get_stdout(self):
so = file(self.stdout, 'a+')
os.dup2(so.fileno(), sys.stdout.fileno())
print 'executed'
Nach os.dup2(so.fileno(), sys.stdout.fileno())
Code gerade stecken. Warum passiert es?
bearbeiten (mit @ C2H5OH Code-Implementierung):
try:
pid = os.fork()
if pid > 0:
# exit first parent
sys.exit(0)
except OSError, e:
sys.stderr.write(
'fork #1 failed: %d (%s)\n' % (e.errno, e.stderror)
)
sys.exit(1)
os.chdir("/")
os.setsid()
os.umask(0)
try:
pid = os.fork()
if pid > 0:
# exit from second parent
sys.exit(0)
except OSError, e:
sys.stderr.write(
"fork #2 failled: %d (%s)" % (e.errno, e.strrerror)
)
sys.exit(1)
# redirect standart file descriptors
os.setsid()
sys.stdin.flush()
sys.stdout.flush()
sys.stderr.flush()
dev_null = os.open(os.devnull, os.O_RDWR)
os.dup2(dev_null, sys.stdin.fileno())
print 'executed 1'
os.dup2(dev_null, sys.stdout.fileno())
print 'executed 2'
os.dup2(dev_null, sys.stderr.fileno())
os.close(dev_null)
# write pidfile
# FIXME: file is not writes!
atexit.register(self.delpid)
pid = str(os.getpid())
file(self.pidfile, 'w+').write("%s\n" % pid)
Im stop
Methode habe ich try-out von self.pidfile
vorhanden:
def stop(self):
print file(self.pidfile, 'r')
Dies ist ein Fehler aus:
IOError: [Errno 2] No such file or directory: '/tmp/deamon-example.pid'
Das Problem m ist immer noch da drin.
Übrigens, Python-Dokumentation [empfiehlt, 'open()' anstelle von 'file()'] zu verwenden (http://docs.python.org/library/functions.html#file) – C2H5OH