The previous patch was bogus, please ignore it.
This should be a bit better:
# HG changeset patch
# User Horms <horms@xxxxxxxxxxxx>
# Node ID 81daa5bcf2ee0a463755e7662606bb6650038f69
# Parent ed749e5935bd8dc283852f4064569415118deeaf
[xend] Detach from terminal
* For setsid to effectivley detach a process from the terminal,
the process must have forked.
Setsid is run in the child process.
The parent process manages the status fd, as per its behaviour in
self.start(), and exits when the fd handling is complete.
The output of ps axf verifies that xend and its subsequenbtly
created child processes are detached from the terminal.
* The call to self.daemonize(), which now forks, is moved to
run before self.tracing(), as not that it actually disconnects
from the terminal, and thus the prevailing process, the trace
looses the processes created in self.run().
diff -r ed749e5935bd -r 81daa5bcf2ee tools/python/xen/xend/server/SrvDaemon.py
--- a/tools/python/xen/xend/server/SrvDaemon.py Mon Nov 28 04:06:14 2005
+++ b/tools/python/xen/xend/server/SrvDaemon.py Mon Nov 28 04:16:03 2005
@@ -121,8 +121,28 @@
return self.child
- def daemonize(self):
+ def daemonize(self, status):
if not XEND_DAEMONIZE: return
+
+ # Fork to allow disconnection from TTY
+ r, w = os.pipe()
+ if self.fork_pid(XEND_PID_FILE):
+ os.close(w)
+ r = os.fdopen(r, 'r')
+ try:
+ s = r.read()
+ finally:
+ r.close()
+ if len(s):
+ status.write(s)
+ status.close()
+ self.exit()
+
+ # Child
+ os.close(r);
+ status.close();
+ status = os.fdopen(w, 'w')
+
# Detach from TTY.
os.setsid()
@@ -140,6 +160,8 @@
os.dup(0)
os.open(XEND_DEBUG_LOG, os.O_WRONLY|os.O_CREAT)
+ return status
+
def start(self, trace=0):
"""Attempts to start the daemons.
@@ -164,7 +186,7 @@
# we can avoid a race condition during startup
r,w = os.pipe()
- if self.fork_pid(XEND_PID_FILE):
+ if os.fork():
os.close(w)
r = os.fdopen(r, 'r')
try:
@@ -178,8 +200,9 @@
else:
os.close(r)
# Child
+ status = self.daemonize(os.fdopen(w, 'w'))
self.tracing(trace)
- self.run(os.fdopen(w, 'w'))
+ self.run(status)
return ret
@@ -274,7 +297,6 @@
relocate.listenRelocation()
servers = SrvServer.create()
- self.daemonize()
servers.start(status)
except Exception, ex:
print >>sys.stderr, 'Exception starting xend:', ex
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|