rc: allow switching runlevels without stopping services

OpenRC, by default, stops all services that are not listed in a runlevel
when rc is used to switch runlevels. This adds a -n/--no-stop command
line option to rc which tells it to skip stopping the services which are
not in the runlevel.

Reported-by: gentoo@thoth.purplefrog.com
X-Gentoo-Bug: 372585
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=372585
This commit is contained in:
William Hubbs 2013-04-28 12:51:12 -05:00
parent 10eabd4d92
commit 10a4385e40
2 changed files with 16 additions and 9 deletions

View File

@ -29,16 +29,17 @@
.Nd stops and starts services for the specified runlevel
.Sh SYNOPSIS
.Nm
.Op Fl n , -no-stop
.Op Fl o , -override
.Op Ar runlevel
.Sh DESCRIPTION
.Nm
first stops any services that are not for the runlevel and then starts any
services in the runlevel and from stacked runlevels added by
first stops any services that are not in the specified runlevel unless
--no-stop is specified, then starts any services in the runlevel and
stacked runlevels added by
.Nm rc-update
that are not currently started.
If no runlevel is specified then we use the current runlevel the system
is currently in.
If no runlevel is specified, we use the current runlevel.
.Pp
There are some special runlevels that you should be aware of:
.Bl -tag -width "shutdown"

View File

@ -729,9 +729,10 @@ handle_bad_signal(int sig)
#include "_usage.h"
#define usagestring "" \
"Usage: rc [options] [<runlevel>]"
#define getoptstring "a:o:s:S" getoptstring_COMMON
#define getoptstring "a:no:s:S" getoptstring_COMMON
static const struct option longopts[] = {
{ "applet", 1, NULL, 'a' },
{ "no-stop", 0, NULL, 'n' },
{ "override", 1, NULL, 'o' },
{ "service", 1, NULL, 's' },
{ "sys", 0, NULL, 'S' },
@ -739,6 +740,7 @@ static const struct option longopts[] = {
};
static const char * const longopts_help[] = {
"runs the applet specified by the next argument",
"do not stop any services",
"override the next runlevel to change into\n"
"when leaving single user or boot runlevels",
"runs the service specified with the rest\nof the arguments",
@ -762,6 +764,7 @@ main(int argc, char **argv)
int opt;
bool parallel;
int regen = 0;
bool nostop = false;
#ifdef __linux__
char *proc;
char *p;
@ -812,6 +815,9 @@ main(int argc, char **argv)
/* Do nothing, actual logic in run_applets, this
* is a placeholder */
break;
case 'n':
nostop = true;
break;
case 'o':
if (*optarg == '\0')
optarg = NULL;
@ -1022,7 +1028,7 @@ main(int argc, char **argv)
parallel = rc_conf_yesno("rc_parallel");
/* Now stop the services that shouldn't be running */
if (stop_services)
if (stop_services && !nostop)
do_stop_services(newlevel, parallel, going_down);
/* Wait for our services to finish */