Add parameter to specify working directory

Fixes #24
This commit is contained in:
Fedor Gogolev
2015-11-02 21:29:44 +03:00
parent 027c123580
commit 21ba701e3a
3 changed files with 44 additions and 2 deletions

View File

@@ -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
View 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()

View File

@@ -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()