Remove rc-help.sh and replace with a man page for runscript 8.
This commit is contained in:
373
man/runscript.8
Normal file
373
man/runscript.8
Normal file
@ -0,0 +1,373 @@
|
||||
.\" Copyright 2007 Roy Marples
|
||||
.\" All rights reserved
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.Dd Dec 20, 2007
|
||||
.Dt RUNSCRIPT 8 SMM
|
||||
.Os OpenRC
|
||||
.Sh NAME
|
||||
.Nm runscript
|
||||
.Nd a means of hooking shell commands into a service
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Fl D , -nodeps
|
||||
.Op Fl d , -debug
|
||||
.Op Fl s , -ifstarted
|
||||
.Op Ar command ...
|
||||
.Sh DESCRIPTION
|
||||
.Nm
|
||||
is basically an interpreter for shell scripts which provide an easy interface
|
||||
to the often complex system commands and daemons.
|
||||
When a service runs a command it first loads it's mulitplexed configuration
|
||||
file, then it's master configuration file, then
|
||||
.Pa /etc/rc.conf
|
||||
and finally the script itself. At this point
|
||||
.Nm
|
||||
then runs the command given.
|
||||
.Pp
|
||||
Commands are defined as shell functions within the script. Here is a list of
|
||||
some functions that all runscripts have by default:
|
||||
.Bl -tag -width "RC_DEFAULTLEVEL"
|
||||
.It Ar describe
|
||||
Describes what the service does and each command the service defines.
|
||||
.It Ar start
|
||||
First we ensure that any services we depend on are started. If any needed
|
||||
services fail to start then we exit with a suitable error, otherwise call the
|
||||
supplied start function if it exists.
|
||||
.It Ar stop
|
||||
First we ensure that any services that depend on us are stopped. If any
|
||||
services that need us fail to stop then we exit with a suitable error,
|
||||
otherwise call the supplied stop function if it exists.
|
||||
.It Ar restart
|
||||
Stop and start the service, including dependencies.
|
||||
.It Ar status
|
||||
Show the status of the service. The return code matches the status, with the
|
||||
exception of "started" returning 0 to match standard command behaviour.
|
||||
.It Ar zap
|
||||
Resets the service state to stopped and removes all saved data about the
|
||||
service.
|
||||
.El
|
||||
.Pp
|
||||
The following options affect how the service is run:
|
||||
.Bl -tag -width "RC_DEFAULTLEVEL"
|
||||
.It Fl d , -debug
|
||||
Set xtrace on in the shell to assist in debugging.
|
||||
.It Fl D , -nodeps
|
||||
Ignore all dependency information the service supplies.
|
||||
.It Fl s , -ifstarted
|
||||
Only run the command if the service has been started.
|
||||
.It Fl q , -quiet
|
||||
Turns off all informational output the service generates.
|
||||
Output from any non OpenRC comands is not affected.
|
||||
.It Fl v , -verbose
|
||||
Turns on any extra informational output the service generates.
|
||||
.El
|
||||
.Pp
|
||||
The following variables affect the service script:
|
||||
.Bl -tag -width "RC_DEFAULTLEVEL"
|
||||
.It Ar extra_commands
|
||||
Space seperated list of extra commands the service defines.
|
||||
.It Ar extra_started_commands
|
||||
Space seperated list of extra commands the service defines. These only work if
|
||||
the service has already been started.
|
||||
.It Ar description
|
||||
String describing the service.
|
||||
.It Ar description_$command
|
||||
String describing the extra command the.
|
||||
.It Ar command
|
||||
Daemon to start or stop via
|
||||
.Nm start-stop-daemon
|
||||
if no start or stop function is defined by the service.
|
||||
.It Ar command_args
|
||||
List of arguments to pass to the daemon when starting.
|
||||
.It Ar pidfile
|
||||
Pidfile to use for the above defined command.
|
||||
.It Ar name
|
||||
Display name used for the above defined command.
|
||||
.El
|
||||
.Sh DEPENDENCIES
|
||||
You should define a
|
||||
.Ic depend
|
||||
function for the service so that
|
||||
.Nm
|
||||
will start and stop it in the right order in relation to other services.
|
||||
As it's a function it can be very flexable, see the example below.
|
||||
Here is a list of the functions you can use in a
|
||||
.Ic depend
|
||||
function. You simply pass the names of the services to it.
|
||||
.Bl -tag -width "RC_DEFAULTLEVEL"
|
||||
.It Ic need
|
||||
The service will refuse to start until needed services have started and it
|
||||
will refuse to stop until any services that need it have stopped.
|
||||
.It Ic use
|
||||
The service will attempt to start any services we use that have been added
|
||||
to the runlevel.
|
||||
.It Ic after
|
||||
The service will start after thse services and stop before these services.
|
||||
.It Ic before
|
||||
The service will start before these services and stop after these services.
|
||||
.It Ic provide
|
||||
We provide this virtual service. For example, named provides dns.
|
||||
.It Ic config
|
||||
We should recalculate our dependencies if the listed files have changed.
|
||||
.It Ic keywords
|
||||
Tags a service with a keyword. Currently the only keyword is notimeout
|
||||
which means that services do not time out waiting for that service, which only
|
||||
applies when services are enabled to start and stop in parallel.
|
||||
.El
|
||||
.Sh BUILTINS
|
||||
.Nm
|
||||
defines some builtin functions that you can use inside your service scripts:
|
||||
.Bl -tag -width indent
|
||||
.It Ic einfo Op Ar string
|
||||
Output a green asterisk followed by the string.
|
||||
.It Ic ewarn Op Ar string
|
||||
Output a yellow asterisk followed by the string.
|
||||
.It Ic eerror Op Ar string
|
||||
Output a red asterisk followed by the string to stderr.
|
||||
.It Ic ebegin Op Ar string
|
||||
Same as einfo, but append 3 dots to the end.
|
||||
.It Ic eend Ar retval Op Ar string
|
||||
If
|
||||
.Ar retval
|
||||
does not equal 0 then output the string using
|
||||
.Ic eerror
|
||||
and !! in square brackets
|
||||
at the end of the line. Otherwise output ok in square brackets at the end of
|
||||
the line. The value of
|
||||
.Ar retval
|
||||
is returned.
|
||||
.It Ic ewend Ar retval Op Ar string
|
||||
Same as
|
||||
.Ic eend ,
|
||||
but use
|
||||
.Ic ewarn
|
||||
instead of
|
||||
.Ic eerror .
|
||||
.El
|
||||
.Pp
|
||||
You can prefix the above commands with the letter
|
||||
.Ic v ,
|
||||
which means they only
|
||||
output when the environment variable
|
||||
.Va EINFO_VERBOSE
|
||||
is true.
|
||||
.Bl -tag -width indent
|
||||
.It Ic service_set_value Ar name Ar value
|
||||
Saves the
|
||||
.Ar name
|
||||
.Ar value
|
||||
for later retrieval. Saved values are lost when the service stops.
|
||||
.It Ic service_get_value Ar name
|
||||
Returns the saved value called
|
||||
.Ar name .
|
||||
.It Ic service_started Op Ar service
|
||||
If the service is started, return 0 otherwise 1.
|
||||
.It Ic service_starting Op Ar service
|
||||
If the service is starting, return 0 otherwise 1.
|
||||
.It Ic service_inactive Op Ar service
|
||||
If the service is inactive, return 0 otherwise 1.
|
||||
.It Ic service_stopping Op Ar service
|
||||
If the service is stopping, return 0 otherwise 1.
|
||||
.It Ic service_stopped Op Ar service
|
||||
If the service is stopped, return 0 otherwise 1.
|
||||
.It Ic service_coldplugged Op Ar service
|
||||
If the service is coldplugged, return 0 otherwise 1.
|
||||
.It Ic service_wasinactive Op Ar service
|
||||
If the service was inactive, return 0 otherwise 1.
|
||||
.It Xo
|
||||
.Ic service_started_daemon
|
||||
.Op Ar service
|
||||
.Ar daemon
|
||||
.Op Ar index
|
||||
.Xc
|
||||
If the service has started the daemon using
|
||||
.Nm start-stop-daemon ,
|
||||
return 0 otherwise 1.
|
||||
If an index is specified, it has to be the nth daemon started by the service.
|
||||
.It Ic mark_service_started Op Ar service
|
||||
Mark the service as started.
|
||||
.It Ic mark_service_starting Op Ar service
|
||||
Mark the service as starting.
|
||||
.It Ic mark_service_inactive Op Ar service
|
||||
Mark the service as inactive.
|
||||
.It Ic mark_service_stopping Op Ar service
|
||||
Mark the service as stopping.
|
||||
.It Ic mark_service_stopped Op Ar service
|
||||
Mark the service as stopped.
|
||||
.It Ic mark_service_coldplugged Op Ar service
|
||||
Mark the service as coldplugged.
|
||||
.It Ic mark_service_wasinactive Op Ar service
|
||||
Mark the service as inactive.
|
||||
.It Xo
|
||||
.Ic checkpath
|
||||
.Op Fl d , -directory
|
||||
.Op Fl f , -file
|
||||
.Op Fl m , -mode Ar mode
|
||||
.Op Fl o , owner Ar owner
|
||||
.Ar path ...
|
||||
.Xc
|
||||
Checks to see if the path exists, is of the right type, owned by the right
|
||||
people and has the correct access modes. If not, then it corrects the path.
|
||||
.El
|
||||
.Sh ENVIRONMENT
|
||||
.Nm
|
||||
sets the following environment variables for use in the service scripts:
|
||||
.Bl -tag -width "RC_DEFAULTLEVEL"
|
||||
.It Va SVCNAME
|
||||
Name of the service.
|
||||
.It Va RC_SOFTLEVEL
|
||||
Current runlevel that rc is in.
|
||||
.It Va RC_BOOTLEVEL
|
||||
Boot runlevel chosen. Default is boot.
|
||||
.It Va RC_DEFAULTLEVEL
|
||||
Default runlevel chosen. Default is default.
|
||||
.It Va RC_SYS
|
||||
A special variable to describe the system more.
|
||||
Possible values are XENU, XEN0, UML and VPS.
|
||||
.It Va RC_UNAME
|
||||
The result of `uname -s`.
|
||||
.El
|
||||
.Sh FILES
|
||||
.Pp
|
||||
Configuration files, relative to the location of the service.
|
||||
If a file ending with .${RC_SOFTLEVEL} exists then we use that instead.
|
||||
.Bl -ohang
|
||||
.It Pa ../conf.d/${SVCNAME%%.*}
|
||||
mulitplexed configuration file.
|
||||
Example: if ${SVCNAME} is net.eth1 then look for
|
||||
.Pa ../conf.d/net .
|
||||
.It Pa ../conf.d/${SVCNAME}
|
||||
service configuration file.
|
||||
.It Pa /etc/rc.conf
|
||||
host configuration file.
|
||||
.El
|
||||
.Pp
|
||||
With the exception of
|
||||
.Pa /etc/rc.conf ,
|
||||
the configuration files can also influence the dependencies of the service
|
||||
through variables. Simply prefix the name of the dependency with rc_.
|
||||
Example:
|
||||
.Bd -literal -offset indent
|
||||
# Whilst most services don't bind to a specific interface, our
|
||||
# openvpn configuration requires a specific interface, namely bge0.
|
||||
rc_need="net.bge0"
|
||||
.Ed
|
||||
.Sh EXAMPLES
|
||||
.Pp
|
||||
An example service script for foo.
|
||||
.Bd -literal -offset indent
|
||||
#!/sbin/runscript
|
||||
command=/usr/bin/foo
|
||||
command_args="${foo_args} --bar"
|
||||
pidfile=/var/run/foo.pid
|
||||
name="FooBar Daemon"
|
||||
|
||||
description="FooBar is a daemon that eats and drinks"
|
||||
extra_commands="show"
|
||||
extra_started_commands="drink eat"
|
||||
description_drink="Opens mouth and reflexively swallows"
|
||||
description_eat="Chews food in mouth"
|
||||
description_show="Shows what's in the tummy"
|
||||
|
||||
_need_dbus() {
|
||||
grep -q dbus /etc/foo/plugins
|
||||
}
|
||||
|
||||
depend() {
|
||||
# We write a pidfile and to /var/cache, so we need localmount.
|
||||
need localmount
|
||||
# We can optionally use the network, but it's not essential.
|
||||
use net
|
||||
# We should be after bootmisc so that /var/run is cleaned before
|
||||
# we put our pidfile there.
|
||||
after bootmisc
|
||||
|
||||
# Foo may use a dbus plugin.
|
||||
# However, if we add the dbus plugin whilst foo is running and
|
||||
# stop dbus, we don't need to stop foo as foo didn't use dbus.
|
||||
config /etc/foo/plugins
|
||||
local _need=
|
||||
if service_started; then
|
||||
_need=`service_get_value need`
|
||||
else
|
||||
if _need_dbus; then
|
||||
_need="${_need} dbus"
|
||||
fi
|
||||
fi
|
||||
need ${_need}
|
||||
}
|
||||
|
||||
start_pre() {
|
||||
# Ensure that our dirs are correct
|
||||
checkpath --dir --owner foo:foo --mode 0664 \\
|
||||
/var/run/foo /var/cache/foo
|
||||
}
|
||||
|
||||
start_post() {
|
||||
# Save our need
|
||||
if _need_dbus; then
|
||||
service_set_value need dbus
|
||||
fi
|
||||
}
|
||||
|
||||
stop_post() {
|
||||
# Clean any spills
|
||||
rm -rf /var/cache/foo/*
|
||||
}
|
||||
|
||||
drink() {
|
||||
ebegin "Starting to drink"
|
||||
${command} --drink beer
|
||||
eend $? "Failed to drink any beer :("
|
||||
}
|
||||
|
||||
eat() {
|
||||
local result=0 retval= ate= food=
|
||||
ebegin "Starting to eat"
|
||||
for food in /usr/share/food/*; do
|
||||
veinfo "Eating `basename ${food}`"
|
||||
${command} --eat ${food}
|
||||
retval=$?
|
||||
: $((${result} += ${retval}))
|
||||
[ ${retval} = 0 ] && ate="${ate} `basename ${food}`"
|
||||
done
|
||||
if eend ${result} "Failed to eat all the food"; then
|
||||
service_set_value ate "${ate}"
|
||||
fi
|
||||
}
|
||||
|
||||
show() {
|
||||
einfo "Foo has eaten: `service_get_value ate`"
|
||||
}
|
||||
|
||||
.Ed
|
||||
.Sh SEE ALSO
|
||||
.Xr rc 8 ,
|
||||
.Xr rc-status 8 ,
|
||||
.Xr rc-update 8 ,
|
||||
.Xr sh 1p ,
|
||||
.Xr start-stop-daemon 8 ,
|
||||
.Xr uname 1
|
||||
.Sh AUTHORS
|
||||
.An "Roy Marples" Aq roy@marples.name
|
Reference in New Issue
Block a user