commit c339114bb5d179d2fb71172fea35527e9091c1bb
Author: Jan Tluka <jtluka(a)redhat.com>
Date: Fri Sep 19 10:45:56 2014 +0200
Daemon: use double fork for daemonization
The daemon code used just a single fork to detach lnst-slave and become
a daemon. However this was insufficient and caused hangs when daemonized
inside Beaker jobs. The proper way is to use double fork method.
Version 2:
Added missing file descriptor redirection.
Signed-off-by: Jan Tluka <jtluka(a)redhat.com>
Signed-off-by: Jiri Pirko <jiri(a)resnulli.us>
lnst/Common/Daemon.py | 22 ++++++++++++++++++++++
1 files changed, 22 insertions(+), 0 deletions(-)
---
diff --git a/lnst/Common/Daemon.py b/lnst/Common/Daemon.py
index cf7dd22..9dd2847 100644
--- a/lnst/Common/Daemon.py
+++ b/lnst/Common/Daemon.py
@@ -64,9 +64,31 @@ class Daemon:
pid = os.fork()
if pid > 0:
sys.exit(0)
+ except OSError as e:
+ logging.error("fork failed: %d (%s)\n" % (e.errno, e.strerror))
+ sys.exit(1)
+
+ os.setsid()
+
+ # do the second fork
+ try:
+ pid = os.fork()
+ if pid > 0:
+ sys.exit(0)
pid = os.getpid()
self._write_pid(pid)
logging.info("deamonized with pid %d" % pid)
except OSError as e:
logging.error("fork failed: %d (%s)\n" % (e.errno, e.strerror))
sys.exit(1)
+
+ # redirect the file descs
+ sys.stdout.flush()
+ sys.stderr.flush()
+
+ si = file("/dev/null", 'r')
+ so = file("/dev/null", 'a+')
+ se = file("/dev/null", 'a+', 0)
+ os.dup2(si.fileno(), sys.stdin.fileno())
+ os.dup2(so.fileno(), sys.stdout.fileno())
+ os.dup2(se.fileno(), sys.stderr.fileno())
Show replies by date