summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorianb <devnull@localhost>2005-06-10 22:32:27 +0000
committerianb <devnull@localhost>2005-06-10 22:32:27 +0000
commit961effc787d7228a5f6538f9f9c8ec7bef5e9cc3 (patch)
tree6994e8e78e38caf256c9538d51cf96e857fae466
parent5fa60f809e59704cc24cd9024f0c425b293d4cc4 (diff)
downloadpaste-961effc787d7228a5f6538f9f9c8ec7bef5e9cc3.tar.gz
Added a --stop-daemon option to paster serve
-rw-r--r--paste/app_setup.py42
-rwxr-xr-xpaste/server.py8
2 files changed, 41 insertions, 9 deletions
diff --git a/paste/app_setup.py b/paste/app_setup.py
index 9cd9f20..0ae6262 100644
--- a/paste/app_setup.py
+++ b/paste/app_setup.py
@@ -4,9 +4,16 @@ import optparse
import fnmatch
import os
import sys
+import atexit
from cStringIO import StringIO
import re
import textwrap
+try:
+ import signal
+except ImportError:
+ # Not available on Windows?
+ pass
+
from paste.util.thirdparty import load_new_module
string = load_new_module('string', (2, 4))
@@ -301,10 +308,17 @@ class CommandServe(Command):
metavar='SERVER_NAME',
help="The kind of server to start",
dest="server")
+ parser.add_option(
+ '--stop-daemon',
+ help="Stop a daemon process (given the PID file)",
+ action="store_true",
+ dest="stop_daemon")
def command(self):
conf = self.config
verbose = conf.get('verbose') or 0
+ if conf.get('stop_daemon'):
+ return self.stop_daemon()
if conf.get('daemon'):
if not conf.get('pid_file'):
conf['pid_file'] = 'server.pid'
@@ -352,11 +366,9 @@ class CommandServe(Command):
+ ' Starting server PID: %s ' % os.getpid()
+ '-'*20 + '\n')
self.change_user_group(conf.get('user'), conf.get('group'))
- try:
- sys.exit(server.run_server(conf, self.app))
- finally:
- if conf.get('pid_file'):
- os.unlink(conf['pid_file'])
+ if conf.get('pid_file'):
+ atexit.register(_remove_pid_file, conf['pid_file'])
+ sys.exit(server.run_server(conf, self.app))
def change_user_group(self, user, group):
if not user and not group:
@@ -390,10 +402,24 @@ class CommandServe(Command):
if uid:
os.setuid(uid)
+ def stop_daemon(self):
+ pid_file = self.config.get('pid_file', 'server.pid')
+ if not os.path.exists(pid_file):
+ print 'No PID file exists in %s' % pid_file
+ return 1
+ f = open(pid_file)
+ pid = int(f.read().strip())
+ f.close()
+ os.kill(pid, signal.SIGTERM)
+ if self.config.get('verbose'):
+ print 'Process %i killed' % pid
+ return 0
+
def parse_args(self, args):
# Unlike most commands, this takes arbitrary options and folds
# them into the configuration
- conf, app = server.load_commandline(args)
+ conf, app = server.load_commandline(
+ args, extra_boolean=['stop_daemon'])
if conf is None:
sys.exit(app)
if app == 'help':
@@ -708,5 +734,9 @@ class TypeMapper(dict):
else:
return dict.__getitem__(self, item)
+def _remove_pid_file(filename):
+ print "Removing %s" % filename
+ os.unlink(filename)
+
if __name__ == '__main__':
run(sys.argv)
diff --git a/paste/server.py b/paste/server.py
index 0d0388a..6e1d294 100755
--- a/paste/server.py
+++ b/paste/server.py
@@ -60,11 +60,13 @@ reloader_environ_key = 'WSGI_RELOADER_SHOULD_RUN'
default_config_fn = os.path.join(os.path.dirname(__file__),
'default_config.conf')
-def load_commandline(args, allow_reload=True):
+def load_commandline(args, extra_boolean=(), allow_reload=True):
conf = pyconfig.Config(with_default=True)
+ boolean_options = ['help', 'verbose', 'reload', 'debug',
+ 'quiet', 'no_verbose', 'list_servers',
+ 'daemon'] + list(extra_boolean)
conf.load_commandline(
- args, bool_options=['help', 'verbose', 'reload', 'debug', 'quiet',
- 'no_verbose', 'list_servers', 'daemon'],
+ args, bool_options=boolean_options,
aliases={'h': 'help', 'v': 'verbose', 'f': 'config_file',
'D': 'debug', 'q': 'quiet'})
if conf.get('no_verbose'):