Changes with Apache 2.0.26-dev
+ *) Switch back to SIGUSR1 for graceful restarts on all platforms that
+ support it. [Justin Erenkrantz]
+
*) Cleanup the worker MPM. We no longer re-use transaction
pools. This incurs less overhead than shuffling the pools
around so that they can be re-used. Remove one of the
APACHE_SUBST(SHLTCFLAGS)
APACHE_SUBST(LTCFLAGS)
+AP_SIG_GRACEFUL=SIGUSR1
+
case $host in
*-apple-aux3*)
APR_SETVAR(APACHE_MPM, [prefork])
;;
*-linux-*)
case `uname -r` in
- 2.[[2-9]]* ) APR_SETVAR(SINGLE_LISTEN_UNSERIALIZED_ACCEPT, [1])
+ 2.0* )
+ AP_SIG_GRACEFUL=SIGWINCH
+ ;;
+ 2.[[2-9]]* )
+ APR_SETVAR(SINGLE_LISTEN_UNSERIALIZED_ACCEPT, [1])
;;
* )
;;
[This platform doesn't suffer from the thundering herd problem])
fi
+AC_DEFINE_UNQUOTED(AP_SIG_GRACEFUL, $AP_SIG_GRACEFUL, [Signal used to gracefully restart])
+AC_DEFINE_UNQUOTED(AP_SIG_GRACEFUL_STRING, "$AP_SIG_GRACEFUL", [Signal used to gracefully restart (as a quoted string)])
+AC_SUBST(AP_SIG_GRACEFUL)
+
dnl check for endianness
if test "$cross_compiling" = "no"; then
AC_C_BIGENDIAN
case APR_OC_REASON_LOST:
/* it would be better to restart just the cgid child
* process but for now we'll gracefully restart the entire
- * server by sending SIGWINCH to ourself, the httpd parent
- * process
+ * server by sending AP_SIG_GRACEFUL to ourself, the httpd
+ * parent process
*/
- kill(getpid(), SIGWINCH);
+ kill(getpid(), AP_SIG_GRACEFUL);
break;
case APR_OC_REASON_RESTART:
apr_proc_other_child_unregister(data);
/*
* This module is used to load Apache modules at runtime. This means that the
* server functionality can be extended without recompiling and even without
- * taking the server down at all. Only a HUP or WINCH signal needs to be send
- * to the server to reload the dynamically loaded modules.
+ * taking the server down at all. Only a HUP or AP_SIG_GRACEFUL signal
+ * needs to be sent to the server to reload the dynamically loaded modules.
*
* To use, you'll first need to build your module as a shared library, then
* update your configuration (httpd.conf) to get the Apache core to load the
* directive to get these log messages).
*
* If you edit the LoadModule directives while the server is live you can get
- * Apache to re-load the modules by sending it a HUP or WINCH signal as normal.
- * You can use this to dynamically change the capability of your server
- * without bringing it down.
+ * Apache to re-load the modules by sending it a HUP or AP_SIG_GRACEFUL
+ * signal as normal. You can use this to dynamically change the capability
+ * of your server without bringing it down.
*
* Because currently there is only limited builtin support in the Configure
* script for creating the shared library files (`.so'), please consult your
mypid = getpid();
if (mypid != saved_pid
&& apr_stat(&finfo, fname, APR_FINFO_MTIME, p) == APR_SUCCESS) {
- /* WINCH and HUP call this on each restart.
+ /* AP_SIG_GRACEFUL and HUP call this on each restart.
* Only warn on first time through for this pid.
*
* XXX: Could just write first time through too, although
/*
* The max child slot ever assigned, preserved across restarts. Necessary
- * to deal with MaxClients changes across SIGWINCH restarts. We use this
- * value to optimize routines that have to scan the entire scoreboard.
+ * to deal with MaxClients changes across AP_SIG_GRACEFUL restarts. We use
+ * this value to optimize routines that have to scan the entire scoreboard.
*/
int ap_max_child_assigned = -1;
int ap_max_threads_limit = -1;
static void restart(int sig)
{
- ap_start_restart(sig == SIGWINCH);
+ ap_start_restart(sig == AP_SIG_GRACEFUL);
}
static void tell_workers_to_exit(void)
if (sigaction(SIGPIPE, &sa, NULL) < 0)
ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGPIPE)");
- /* we want to ignore HUPs and WINCH while we're busy processing one */
+ /* we want to ignore HUPs and AP_SIG_GRACEFUL while we're busy
+ * processing one */
sigaddset(&sa.sa_mask, SIGHUP);
- sigaddset(&sa.sa_mask, SIGWINCH);
+ sigaddset(&sa.sa_mask, AP_SIG_GRACEFUL);
sa.sa_handler = restart;
if (sigaction(SIGHUP, &sa, NULL) < 0)
ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGHUP)");
- if (sigaction(SIGWINCH, &sa, NULL) < 0)
- ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGWINCH)");
+ if (sigaction(AP_SIG_GRACEFUL, &sa, NULL) < 0)
+ ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(" AP_SIG_GRACEFUL_STRING ")");
}
/*****************************************************************
/* If we're doing a graceful_restart then we're going to see a lot
* of threads exiting immediately when we get into the main loop
- * below (because we just sent them SIGWINCH). This happens pretty
- * rapidly... and for each one that exits we'll start a new one until
- * we reach at least threads_min_free. But we may be permitted to
+ * below (because we just sent them AP_SIG_GRACEFUL). This happens
+ * pretty rapidly... and for each one that exits we'll start a new one
+ * until we reach at least threads_min_free. But we may be permitted to
* start more than that, so we'll just keep track of how many we're
* supposed to start up without the 1 second penalty between each fork.
*/
if (is_graceful) {
ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_NOTICE, 0, ap_server_conf,
- "SIGWINCH received. Doing graceful restart");
+ AP_SIG_GRACEFUL_STRING " received. Doing graceful restart");
}
else {
/* Kill 'em all. Since the child acts the same on the parents SIGTERM
/*
* The max child slot ever assigned, preserved across restarts. Necessary
- * to deal with NumServers changes across SIGWINCH restarts. We use this
- * value to optimize routines that have to scan the entire child table.
+ * to deal with NumServers changes across AP_SIG_GRACEFUL restarts. We
+ * use this value to optimize routines that have to scan the entire child
+ * table.
*
* XXX - It might not be worth keeping this code in. There aren't very
* many child processes in this MPM.
static void restart(int sig)
{
#ifndef WIN32
- ap_start_restart(sig == SIGWINCH);
+ ap_start_restart(sig == AP_SIG_GRACEFUL);
#else
ap_start_restart(1);
#endif
ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGPIPE)");
#endif
- /* we want to ignore HUPs and WINCH while we're busy processing one */
+ /* we want to ignore HUPs and AP_SIG_GRACEFUL while we're busy
+ * processing one */
sigaddset(&sa.sa_mask, SIGHUP);
- sigaddset(&sa.sa_mask, SIGWINCH);
+ sigaddset(&sa.sa_mask, AP_SIG_GRACEFUL);
sa.sa_handler = restart;
if (sigaction(SIGHUP, &sa, NULL) < 0)
ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGHUP)");
- if (sigaction(SIGWINCH, &sa, NULL) < 0)
- ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGWINCH)");
+ if (sigaction(AP_SIG_GRACEFUL, &sa, NULL) < 0)
+ ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(" AP_SIG_GRACEFUL_STRING ")");
#else
if (!one_process) {
apr_signal(SIGSEGV, sig_coredump);
#ifdef SIGHUP
apr_signal(SIGHUP, restart);
#endif /* SIGHUP */
-#ifdef SIGWINCH
- apr_signal(SIGWINCH, restart);
-#endif /* SIGWINCH */
+#ifdef AP_SIG_GRACEFUL
+ apr_signal(AP_SIG_GRACEFUL, restart);
+#endif /* AP_SIG_GRACEFUL */
#ifdef SIGPIPE
apr_signal(SIGPIPE, SIG_IGN);
#endif /* SIGPIPE */
/* If we're doing a graceful_restart then we're going to see a lot
* of children exiting immediately when we get into the main loop
- * below (because we just sent them SIGWINCH). This happens pretty
- * rapidly... and for each one that exits we'll start a new one until
- * we reach at least daemons_min_free. But we may be permitted to
+ * below (because we just sent them AP_SIG_GRACEFUL). This happens
+ * pretty rapidly... and for each one that exits we'll start a new one
+ * until we reach at least daemons_min_free. But we may be permitted to
* start more than that, so we'll just keep track of how many we're
* supposed to start up without the 1 second penalty between each fork.
*/
char char_of_death = '!';
ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_NOTICE, 0, ap_server_conf,
- "SIGWINCH received. Doing graceful restart");
+ AP_SIG_GRACEFUL_STRING " received. Doing graceful restart");
/* This is mostly for debugging... so that we know what is still
* gracefully dealing with existing request.
/*
* The max child slot ever assigned, preserved across restarts. Necessary
- * to deal with NumServers changes across SIGWINCH restarts. We use this
- * value to optimize routines that have to scan the entire child table.
+ * to deal with NumServers changes across AP_SIG_GRACEFUL restarts. We
+ * use this value to optimize routines that have to scan the entire child
+ * table.
*
* XXX - It might not be worth keeping this code in. There aren't very
* many child processes in this MPM.
static void restart(int sig)
{
#ifndef WIN32
- ap_start_restart(sig == SIGWINCH);
+ ap_start_restart(sig == AP_SIG_GRACEFUL);
#else
ap_start_restart(1);
#endif
ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGPIPE)");
#endif
- /* we want to ignore HUPs and WINCH while we're busy processing one */
+ /* we want to ignore HUPs and AP_SIG_GRACEFUL while we're busy
+ * processing one */
sigaddset(&sa.sa_mask, SIGHUP);
- sigaddset(&sa.sa_mask, SIGWINCH);
+ sigaddset(&sa.sa_mask, AP_SIG_GRACEFUL);
sa.sa_handler = restart;
if (sigaction(SIGHUP, &sa, NULL) < 0)
ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGHUP)");
- if (sigaction(SIGWINCH, &sa, NULL) < 0)
- ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGWINCH)");
+ if (sigaction(AP_SIG_GRACEFUL, &sa, NULL) < 0)
+ ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(" AP_SIG_GRACEFUL_STRING ")");
#else
if (!one_process) {
apr_signal(SIGSEGV, sig_coredump);
#ifdef SIGHUP
apr_signal(SIGHUP, restart);
#endif /* SIGHUP */
-#ifdef SIGWINCH
- apr_signal(SIGWINCH, restart);
-#endif /* SIGWINCH */
+#ifdef AP_SIG_GRACEFUL
+ apr_signal(AP_SIG_GRACEFUL, restart);
+#endif /* AP_SIG_GRACEFUL */
#ifdef SIGPIPE
apr_signal(SIGPIPE, SIG_IGN);
#endif /* SIGPIPE */
/* If we're doing a graceful_restart then we're going to see a lot
* of children exiting immediately when we get into the main loop
- * below (because we just sent them SIGWINCH). This happens pretty
- * rapidly... and for each one that exits we'll start a new one until
- * we reach at least daemons_min_free. But we may be permitted to
+ * below (because we just sent them AP_SIG_GRACEFUL). This happens
+ * pretty rapidly... and for each one that exits we'll start a new one
+ * until we reach at least daemons_min_free. But we may be permitted to
* start more than that, so we'll just keep track of how many we're
* supposed to start up without the 1 second penalty between each fork.
*/
char char_of_death = '!';
ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_NOTICE, 0, ap_server_conf,
- "SIGWINCH received. Doing graceful restart");
+ AP_SIG_GRACEFUL_STRING " received. Doing graceful restart");
/* This is mostly for debugging... so that we know what is still
* gracefully dealing with existing request.
/*
* The max child slot ever assigned, preserved across restarts. Necessary
- * to deal with MaxClients changes across SIGWINCH restarts. We use this
- * value to optimize routines that have to scan the entire scoreboard.
+ * to deal with MaxClients changes across AP_SIG_GRACEFUL restarts. We
+ * use this value to optimize routines that have to scan the entire scoreboard.
*/
int ap_max_daemons_limit = -1;
server_rec *ap_server_conf;
shutdown_pending = 1;
}
-/* restart() is the signal handler for SIGHUP and SIGWINCH
+/* restart() is the signal handler for SIGHUP and AP_SIG_GRACEFUL
* in the parent process, unless running in ONE_PROCESS mode
*/
static void restart(int sig)
return;
}
restart_pending = 1;
- if ((is_graceful = (sig == SIGWINCH))) {
+ if ((is_graceful = (sig == AP_SIG_GRACEFUL))) {
apr_pool_cleanup_kill(pconf, NULL, ap_cleanup_scoreboard);
}
}
ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGPIPE)");
#endif
- /* we want to ignore HUPs and WINCH while we're busy processing one */
+ /* we want to ignore HUPs and AP_SIG_GRACEFUL while we're busy
+ * processing one */
sigaddset(&sa.sa_mask, SIGHUP);
- sigaddset(&sa.sa_mask, SIGWINCH);
+ sigaddset(&sa.sa_mask, AP_SIG_GRACEFUL);
sa.sa_handler = restart;
if (sigaction(SIGHUP, &sa, NULL) < 0)
ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGHUP)");
- if (sigaction(SIGWINCH, &sa, NULL) < 0)
- ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGWINCH)");
+ if (sigaction(AP_SIG_GRACEFUL, &sa, NULL) < 0)
+ ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(" AP_SIG_GRACEFUL_STRING ")");
#else
if (!one_process) {
apr_signal(SIGSEGV, sig_coredump);
#ifdef SIGHUP
apr_signal(SIGHUP, restart);
#endif /* SIGHUP */
-#ifdef SIGWINCH
- apr_signal(SIGWINCH, restart);
-#endif /* SIGWINCH */
+#ifdef AP_SIG_GRACEFUL
+ apr_signal(AP_SIG_GRACEFUL, restart);
+#endif /* AP_SIG_GRACEFUL */
#ifdef SIGPIPE
apr_signal(SIGPIPE, SIG_IGN);
#endif /* SIGPIPE */
if (one_process) {
apr_signal(SIGHUP, just_die);
- /* Don't catch SIGWINCH in ONE_PROCESS mode :) */
+ /* Don't catch AP_SIG_GRACEFUL in ONE_PROCESS mode :) */
apr_signal(SIGINT, just_die);
#ifdef SIGQUIT
apr_signal(SIGQUIT, SIG_DFL);
*/
apr_signal(SIGHUP, just_die);
apr_signal(SIGTERM, just_die);
- /* The child process doesn't do anything for SIGWINCH. Instead, the
- * pod is used for signalling graceful restart.
+ /* The child process doesn't do anything for AP_SIG_GRACEFUL.
+ * Instead, the pod is used for signalling graceful restart.
*/
- apr_signal(SIGWINCH, SIG_IGN);
+ apr_signal(AP_SIG_GRACEFUL, SIG_IGN);
child_main(slot);
}
/* If we're doing a graceful_restart then we're going to see a lot
* of children exiting immediately when we get into the main loop
- * below (because we just sent them SIGWINCH). This happens pretty
+ * below (because we just sent them AP_SIG_GRACEFUL). This happens pretty
* rapidly... and for each one that exits we'll start a new one until
* we reach at least daemons_min_free. But we may be permitted to
* start more than that, so we'll just keep track of how many we're
/*
* The max child slot ever assigned, preserved across restarts. Necessary
- * to deal with MaxClients changes across SIGWINCH restarts. We use this
- * value to optimize routines that have to scan the entire scoreboard.
+ * to deal with MaxClients changes across AP_SIG_GRACEFUL restarts. We use
+ * this value to optimize routines that have to scan the entire scoreboard.
*/
int ap_max_daemons_limit = -1;
static void restart(int sig)
{
- ap_start_restart(sig == SIGWINCH);
+ ap_start_restart(sig == AP_SIG_GRACEFUL);
}
static void set_signals(void)
ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGPIPE)");
#endif
- /* we want to ignore HUPs and WINCH while we're busy processing one */
+ /* we want to ignore HUPs and AP_SIG_GRACEFUL while we're busy
+ * processing one */
sigaddset(&sa.sa_mask, SIGHUP);
- sigaddset(&sa.sa_mask, SIGWINCH);
+ sigaddset(&sa.sa_mask, AP_SIG_GRACEFUL);
sa.sa_handler = restart;
if (sigaction(SIGHUP, &sa, NULL) < 0)
ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGHUP)");
- if (sigaction(SIGWINCH, &sa, NULL) < 0)
- ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGWINCH)");
+ if (sigaction(AP_SIG_GRACEFUL, &sa, NULL) < 0)
+ ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(" AP_SIG_GRACEFUL_STRING ")");
#else
if (!one_process) {
apr_signal(SIGSEGV, sig_coredump);
#ifdef SIGHUP
apr_signal(SIGHUP, restart);
#endif /* SIGHUP */
-#ifdef SIGWINCH
- apr_signal(SIGWINCH, restart);
-#endif /* SIGWINCH */
+#ifdef AP_SIG_GRACEFUL
+ apr_signal(AP_SIG_GRACEFUL, restart);
+#endif /* AP_SIG_GRACEFUL */
#ifdef SIGPIPE
apr_signal(SIGPIPE, SIG_IGN);
#endif /* SIGPIPE */
/* If we're doing a graceful_restart then we're going to see a lot
* of children exiting immediately when we get into the main loop
- * below (because we just sent them SIGWINCH). This happens pretty
- * rapidly... and for each one that exits we'll start a new one until
- * we reach at least daemons_min_free. But we may be permitted to
+ * below (because we just sent them AP_SIG_GRACEFUL). This happens
+ * pretty rapidly... and for each one that exits we'll start a new one
+ * until we reach at least daemons_min_free. But we may be permitted to
* start more than that, so we'll just keep track of how many we're
* supposed to start up without the 1 second penalty between each fork.
*/
if (is_graceful) {
ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_NOTICE, 0, ap_server_conf,
- "SIGWINCH received. Doing graceful restart");
+ AP_SIG_GRACEFUL_STRING " received. Doing graceful restart");
/* This is mostly for debugging... so that we know what is still
* gracefully dealing with existing request.
/*
* The max child slot ever assigned, preserved across restarts. Necessary
- * to deal with MaxClients changes across SIGWINCH restarts. We use this
- * value to optimize routines that have to scan the entire scoreboard.
+ * to deal with MaxClients changes across AP_SIG_GRACEFUL restarts. We
+ * use this value to optimize routines that have to scan the entire
+ * scoreboard.
*/
int ap_max_daemons_limit = -1;
static void restart(int sig)
{
- ap_start_restart(sig == SIGWINCH);
+ ap_start_restart(sig == AP_SIG_GRACEFUL);
}
static void set_signals(void)
ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGPIPE)");
#endif
- /* we want to ignore HUPs and WINCH while we're busy processing one */
+ /* we want to ignore HUPs and AP_SIG_GRACEFUL while we're busy
+ * processing one */
sigaddset(&sa.sa_mask, SIGHUP);
- sigaddset(&sa.sa_mask, SIGWINCH);
+ sigaddset(&sa.sa_mask, AP_SIG_GRACEFUL);
sa.sa_handler = restart;
if (sigaction(SIGHUP, &sa, NULL) < 0)
ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGHUP)");
- if (sigaction(SIGWINCH, &sa, NULL) < 0)
- ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGWINCH)");
+ if (sigaction(AP_SIG_GRACEFUL, &sa, NULL) < 0)
+ ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(" AP_SIG_GRACEFUL_STRING ")");
#else
if (!one_process) {
apr_signal(SIGSEGV, sig_coredump);
#ifdef SIGHUP
apr_signal(SIGHUP, restart);
#endif /* SIGHUP */
-#ifdef SIGWINCH
- apr_signal(SIGWINCH, restart);
-#endif /* SIGWINCH */
+#ifdef AP_SIG_GRACEFUL
+ apr_signal(AP_SIG_GRACEFUL, restart);
+#endif /* AP_SIG_GRACEFUL */
#ifdef SIGPIPE
apr_signal(SIGPIPE, SIG_IGN);
#endif /* SIGPIPE */
/* If we're doing a graceful_restart then we're going to see a lot
* of children exiting immediately when we get into the main loop
- * below (because we just sent them SIGWINCH). This happens pretty
+ * below (because we just sent them AP_SIG_GRACEFUL). This happens pretty
* rapidly... and for each one that exits we'll start a new one until
* we reach at least daemons_min_free. But we may be permitted to
* start more than that, so we'll just keep track of how many we're
if (is_graceful) {
ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_NOTICE, 0, ap_server_conf,
- "SIGWINCH received. Doing graceful restart");
+ AP_SIG_GRACEFUL_STRING " received. Doing graceful restart");
/* This is mostly for debugging... so that we know what is still
* gracefully dealing with existing request.
switch (signum) {
case SIGTERM:
case SIGHUP:
- case SIGWINCH:
+ case AP_SIG_GRACEFUL:
case SIGKILL:
break;
default:
}
/* we've probably got something to do, ignore graceful restart requests */
- /* XXX - sigwait doesn't work if the signal has been SIG_IGNed (under
- * linux 2.0 w/ glibc 2.0, anyway), and this step isn't necessary when
- * we're running a sigwait thread anyway. If/when unthreaded mode is
- * put back in, we should make sure to ignore this signal iff a sigwait
- * thread isn't used. - mvsk
-
-#ifdef SIGWINCH
- apr_signal(SIGWINCH, SIG_IGN);
-#endif
- */
-
r->request_time = apr_time_now();
r->the_request = apr_pstrdup(r->pool, l);
r->method = ap_getword_white(r->pool, &ll);
fi
else
if $HTTPD -t >/dev/null 2>&1; then
- if kill -WINCH $PID ; then
+ if kill -@AP_SIG_GRACEFUL@ $PID ; then
echo "$0 $ARG: httpd gracefully restarted"
else
echo "$0 $ARG: httpd could not be restarted"
not running
fullstatus - dump a full status screen; requires lynx and mod_status enabled
status - dump a short status screen; requires lynx and mod_status enabled
-graceful - do a graceful restart by sending a SIGWINCH or start if not running
+graceful - do a graceful restart by sending a @AP_SIG_GRACEFUL@ or start if not running
configtest - do a configuration syntax test
help - this screen