@@ -36,8 +36,12 @@ class Daemonize(object):
|
||||
:param verbose: send debug messages to logger if provided.
|
||||
:param logger: use this logger object instead of creating new one, if provided.
|
||||
:param foreground: stay in foreground; do not fork (for debugging)
|
||||
:param chdir: change working directory if provided or /
|
||||
"""
|
||||
def __init__(self, app, pid, action, keep_fds=None, auto_close_fds=True, privileged_action=None, user=None, group=None, verbose=False, logger=None, foreground=False):
|
||||
def __init__(self, app, pid, action,
|
||||
keep_fds=None, auto_close_fds=True, privileged_action=None,
|
||||
user=None, group=None, verbose=False, logger=None,
|
||||
foreground=False, chdir="/"):
|
||||
self.app = app
|
||||
self.pid = pid
|
||||
self.action = action
|
||||
@@ -49,6 +53,7 @@ class Daemonize(object):
|
||||
self.verbose = verbose
|
||||
self.auto_close_fds = auto_close_fds
|
||||
self.foreground = foreground
|
||||
self.chdir=chdir
|
||||
|
||||
def sigterm(self, signum, frame):
|
||||
"""
|
||||
@@ -171,7 +176,7 @@ class Daemonize(object):
|
||||
|
||||
# Change to a known directory. If this isn't done, starting a daemon in a subdirectory that
|
||||
# needs to be deleted results in "directory busy" errors.
|
||||
os.chdir("/")
|
||||
os.chdir(self.chdir)
|
||||
|
||||
# Execute privileged action
|
||||
privileged_action_result = self.privileged_action()
|
||||
|
||||
18
tests/daemon_chdir.py
Normal file
18
tests/daemon_chdir.py
Normal file
@@ -0,0 +1,18 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
from sys import argv
|
||||
|
||||
from daemonize import Daemonize
|
||||
|
||||
pid = argv[1]
|
||||
working_dir = argv[2]
|
||||
file_name = argv[3]
|
||||
|
||||
|
||||
def main():
|
||||
with open(file_name, "w") as f:
|
||||
f.write("test")
|
||||
|
||||
|
||||
daemon = Daemonize(app="test_app", pid=pid, action=main, chdir=working_dir)
|
||||
daemon.start()
|
||||
@@ -6,6 +6,7 @@ import subprocess
|
||||
|
||||
from tempfile import mkstemp
|
||||
from time import sleep
|
||||
from os.path import split
|
||||
|
||||
NOBODY_UID = pwd.getpwnam("nobody").pw_uid
|
||||
if os.path.exists("/etc/debian_version"):
|
||||
@@ -131,5 +132,23 @@ Stopping daemon.
|
||||
with open(self.logfile, "r") as contents:
|
||||
self.assertEqual(contents.read(), self.correct_log)
|
||||
|
||||
|
||||
class KeepFDsTest(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.pidfile = mkstemp()[1]
|
||||
self.target = mkstemp()[1]
|
||||
base, file = split(self.target)
|
||||
|
||||
os.system("python tests/daemon_chdir.py %s %s %s" % (self.pidfile, base, file))
|
||||
sleep(1)
|
||||
|
||||
def tearDown(self):
|
||||
os.system("kill `cat %s`" % self.pidfile)
|
||||
sleep(.1)
|
||||
|
||||
def test_keep_fds(self):
|
||||
log = open(self.target, "r").read()
|
||||
self.assertEqual(log, "test")
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user