Index: head/usr.sbin/service/service.8 =================================================================== --- head/usr.sbin/service/service.8 (revision 328031) +++ head/usr.sbin/service/service.8 (revision 328032) @@ -1,135 +1,142 @@ .\" Copyright (c) 2009 Douglas Barton .\" 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. .\" .\" $FreeBSD$ .\" -.Dd December 11, 2012 +.Dd January 15, 2018 .Dt SERVICE 8 .Os .Sh NAME .Nm service .Nd "control (start/stop/etc.) or list system services" .Sh SYNOPSIS .Nm +.Op Fl j Ao jail name or id Ac .Fl e .Nm +.Op Fl j Ao jail name or id Ac .Fl R .Nm +.Op Fl j Ao jail name or id Ac .Op Fl v .Fl l | r .Nm +.Op Fl j Ao jail name or id Ac .Op Fl v .Ar start|stop|etc. .Sh DESCRIPTION The .Nm command is an easy interface to the rc.d system. Its primary purpose is to start and stop services provided by the rc.d scripts. When used for this purpose it will set the same restricted environment that is in use at boot time (see below). It can also be used to list the scripts using various criteria. .Pp The options are as follows: .Bl -tag -width F1 +.It Fl j Ao jail name or id Ac +Perform the given actions under the named jail. .It Fl e List services that are enabled. The list of scripts to check is compiled using .Xr rcorder 8 the same way that it is done in .Xr rc 8 , then that list of scripts is checked for an .Qq rcvar assignment. If present the script is checked to see if it is enabled. .It Fl R Restart all enabled local services. .It Fl l List all files in .Pa /etc/rc.d and the local startup directories. As described in .Xr rc.conf 5 this is usually .Pa /usr/local/etc/rc.d . All files will be listed whether they are an actual rc.d script or not. .It Fl r Generate the .Xr rcorder 8 as in .Fl e above, but list all of the files, not just what is enabled. .It Fl v Be slightly more verbose .El .Sh ENVIRONMENT When used to run rc.d scripts the .Nm command sets .Ev HOME to .Pa / and .Ev PATH to .Pa /sbin:/bin:/usr/sbin:/usr/bin which is how they are set in .Pa /etc/rc at boot time. .Sh EXIT STATUS .Ex -std .Sh EXAMPLES The following are examples of typical usage of the .Nm command: .Pp .Dl "service named status" +.Dl "service -j dns named status" .Dl "service -rv" .Pp The following programmable completion entry can be use in .Xr bash 1 for the names of the rc.d scripts: .Dl "_service () {" .Dl " local cur" .Dl " cur=${COMP_WORDS[COMP_CWORD]}" .Dl " COMPREPLY=( $( compgen -W '$( service -l )' -- $cur ) )" .Dl " return 0" .Dl "}" .Dl "complete -F _service service" .Sh SEE ALSO .Xr bash 1 Pq Pa ports/shells/bash , .Xr rc.conf 5 , .Xr rc 8 , .Xr rcorder 8 .Sh HISTORY The .Nm utility first appeared in .Fx 7.3 . .Sh AUTHORS This manual page was written by .An Douglas Barton Aq Mt dougb@FreeBSD.org . Index: head/usr.sbin/service/service.sh =================================================================== --- head/usr.sbin/service/service.sh (revision 328031) +++ head/usr.sbin/service/service.sh (revision 328032) @@ -1,157 +1,188 @@ #!/bin/sh # $FreeBSD$ # SPDX-License-Identifier: BSD-2-Clause-FreeBSD # # Copyright (c) 2009 Douglas Barton # 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. . /etc/rc.subr load_rc_config 'XXX' usage () { echo '' echo 'Usage:' - echo "${0##*/} -e" - echo "${0##*/} -R" - echo "${0##*/} [-v] -l | -r" - echo "${0##*/} [-v] start|stop|etc." + echo "${0##*/} [-j ] -e" + echo "${0##*/} [-j ] -R" + echo "${0##*/} [-j ] [-v] -l | -r" + echo "${0##*/} [-j ] [-v] start|stop|etc." echo "${0##*/} -h" echo '' + echo "-j Perform actions within the named jail" echo '-e Show services that are enabled' echo "-R Stop and start enabled $local_startup services" echo "-l List all scripts in /etc/rc.d and $local_startup" echo '-r Show the results of boot time rcorder' echo '-v Verbose' echo '' } -while getopts 'ehlrRv' COMMAND_LINE_ARGUMENT ; do +accepted_argstr='jehlrRv' + +# Only deal with the -j option here. If found, JAIL is set and the opt and +# arg are shifted out. OPTIND is left untouched. We strip the -j option out +# here because we'll be proxying this invocation through to the jail via +# jls(8) instead of handling it ourselves. +while getopts ${accepted_argstr} COMMAND_LINE_ARGUMENT ; do + case "${COMMAND_LINE_ARGUMENT}" in + j) JAIL="$2" ; shift ; shift ;; + esac +done + +# If -j was provided, then we pass everthing along to the jexec command +# and execute `service` within the named JAIL. Provided that the jail +# actually exists, as checked by `jls`. +# We do this so that if the jail does exist, we can then return the exit +# code of `jexec` and it should be the exit code of whatever ran in the jail. +# There is a race condition here in that the jail might exist at `jls` time +# and be gone by `jexec` time, but it shouldn't be a big deal. +if [ -n "$JAIL" ]; then + /usr/sbin/jls -j "$JAIL" 2>/dev/null >/dev/null + if [ $? -ne 0 ]; then + echo "Jail '$JAIL' does not exist." + exit 1 + fi + + /usr/sbin/jexec -l "$JAIL" /usr/sbin/service $* + exit $? +fi + +while getopts ${accepted_argstr} COMMAND_LINE_ARGUMENT ; do case "${COMMAND_LINE_ARGUMENT}" in e) ENABLED=eopt ;; h) usage ; exit 0 ;; l) LIST=lopt ;; r) RCORDER=ropt ;; R) RESTART=Ropt ;; v) VERBOSE=vopt ;; *) usage ; exit 1 ;; esac done shift $(( $OPTIND - 1 )) if [ -n "$RESTART" ]; then skip="-s nostart" if [ `/sbin/sysctl -n security.jail.jailed` -eq 1 ]; then skip="$skip -s nojail" fi [ -n "$local_startup" ] && find_local_scripts_new files=`rcorder ${skip} ${local_rc} 2>/dev/null` for file in `reverse_list ${files}`; do if grep -q ^rcvar $file; then eval `grep ^name= $file` eval `grep ^rcvar $file` if [ -n "$rcvar" ]; then load_rc_config_var ${name} ${rcvar} fi checkyesno $rcvar 2>/dev/null && run_rc_script ${file} stop fi done for file in $files; do if grep -q ^rcvar $file; then eval `grep ^name= $file` eval `grep ^rcvar $file` checkyesno $rcvar 2>/dev/null && run_rc_script ${file} start fi done exit 0 fi if [ -n "$ENABLED" -o -n "$RCORDER" ]; then # Copied from /etc/rc skip="-s nostart" if [ `/sbin/sysctl -n security.jail.jailed` -eq 1 ]; then skip="$skip -s nojail" fi [ -n "$local_startup" ] && find_local_scripts_new files=`rcorder ${skip} /etc/rc.d/* ${local_rc} 2>/dev/null` fi if [ -n "$ENABLED" ]; then for file in $files; do if grep -q ^rcvar $file; then eval `grep ^name= $file` eval `grep ^rcvar $file` if [ -n "$rcvar" ]; then load_rc_config_var ${name} ${rcvar} fi checkyesno $rcvar 2>/dev/null && echo $file fi done exit 0 fi if [ -n "$LIST" ]; then for dir in /etc/rc.d $local_startup; do [ -n "$VERBOSE" ] && echo "From ${dir}:" [ -d ${dir} ] && /bin/ls -1 ${dir} done exit 0 fi if [ -n "$RCORDER" ]; then for file in $files; do echo $file if [ -n "$VERBOSE" ]; then case "$file" in */${early_late_divider}) echo '========= Early/Late Divider =========' ;; esac fi done exit 0 fi if [ $# -gt 1 ]; then script=$1 shift else usage exit 1 fi cd / for dir in /etc/rc.d $local_startup; do if [ -x "$dir/$script" ]; then [ -n "$VERBOSE" ] && echo "$script is located in $dir" exec env -i HOME=/ PATH=/sbin:/bin:/usr/sbin:/usr/bin $dir/$script $* fi done # If the script was not found echo "$script does not exist in /etc/rc.d or the local startup" echo "directories (${local_startup}), or is not executable" exit 1