diff --git a/usr.sbin/service/service.8 b/usr.sbin/service/service.8 index 67597bf9258e..be68694b1be0 100644 --- a/usr.sbin/service/service.8 +++ b/usr.sbin/service/service.8 @@ -1,218 +1,221 @@ .\" 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. .\" -.Dd May 9, 2025 +.Dd August 2, 2025 .Dt SERVICE 8 .Os .Sh NAME .Nm service .Nd "control (start/stop/etc.) or list system services" .Sh SYNOPSIS .Nm .Op Fl j Ar jail .Fl e .Nm .Op Fl j Ar jail +.Op Fl q .Fl R .Nm .Op Fl j Ar jail .Op Fl v .Fl l .Nm .Op Fl j Ar jail .Op Fl v .Fl r .Nm .Op Fl j Ar jail -.Op Fl q -.Op Fl v +.Op Fl dqv .Op Fl E Ar var=value .Ar script .Op Ar command .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 .Po see .Sx ENVIRONMENT .Pc . It can also be used to list the scripts using various criteria. .Pp The set of permissible values for .Ar command depends on the particular rc.d script being invoked. For a list of standard commands which are supported by most rc.d scripts, see .Xr rc 8 . .Pp The options are as follows: .Bl -tag -width F1 +.It Fl d +Enable debugging. .It Fl E Ar var=value Set the environment variable .Ar var to the specified .Ar value before starting the script. This option can be used multiple times. .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 j Ar jail Perform the given actions under the named jail. The .Ar jail argument can be either a jail ID or a jail name. .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 q +Be quiet, redirecting output to +.Pa /dev/null . .It Fl R Restart all enabled local services. .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. -.It Fl q -Be quiet, redirecting output to /dev/null. .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. If the .Fl E option is used, the corresponding variable is set accordingly. .Sh EXIT STATUS .Ex -std .Sh EXAMPLES These are some examples of the most common service commands. For a full list of commands available in most rc.d scripts, see .Xr rc 8 . .Pp Enable a service, then start it: .Bd -literal -offset indent service sshd enable service sshd start .Ed .Pp Stop a service, then disable it: .Bd -literal -offset indent service sshd stop service sshd disable .Ed .Pp Start a service which is not enabled: .Bd -literal -offset indent service sshd onestart .Ed .Pp Report the status of a service: .Bd -literal -offset indent service named status .Ed .Pp Restart a service running in a jail: .Bd -literal -offset indent service -j dns named restart .Ed .Pp Start a service with a specific environment variable set: .Bd -literal -offset indent service -E LC_ALL=C.UTF-8 named start .Ed .Pp Report a verbose listing of all available services: .Bd -literal -offset indent service -rv .Ed .Pp The following programmable completion entry can be used in .Xr csh 1 for the names and common commands of the rc.d scripts: .Bd -literal -offset indent complete service 'c/-/(e l r v)/' 'p/1/`service -l`/' \e 'n/*/(start stop reload restart \e status rcvar onestart onestop)/' .Ed .Pp The following programmable completion entry can be used in .Xr bash 1 for the names of the rc.d scripts: .Bd -literal -offset indent _service () { local cur cur=${COMP_WORDS[COMP_CWORD]} COMPREPLY=( $( compgen -W '$( service -l )' -- $cur ) ) return 0 } complete -F _service service .Ed .Sh SEE ALSO .Xr bash 1 Pq Pa ports/shells/bash , .Xr rc.conf 5 , .Xr rc 8 , .Xr rcorder 8 , .Xr sysrc 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 . diff --git a/usr.sbin/service/service.sh b/usr.sbin/service/service.sh index 5f456418da49..9387a49051d6 100755 --- a/usr.sbin/service/service.sh +++ b/usr.sbin/service/service.sh @@ -1,199 +1,206 @@ #!/bin/sh # SPDX-License-Identifier: BSD-2-Clause # # 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' +load_rc_config usage () { echo '' echo 'Usage:' echo "${0##*/} [-j ] -e" - echo "${0##*/} [-j ] -R" - echo "${0##*/} [-j ] [-v] -l | -r" - echo "${0##*/} [-j ] [-v] [-E var=value] start|stop|etc." + echo "${0##*/} [-j ] [-q] -R" + echo "${0##*/} [-j ] [-v] -l" + echo "${0##*/} [-j ] [-v] -r" + echo "${0##*/} [-j ] [-dqv] [-E var=value] start|stop|etc." echo "${0##*/} -h" echo '' + echo "-d Enable debugging of rc.d scripts" echo "-j Perform actions within the named jail" echo "-E n=val Set variable n to val before executing the rc.d script" 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 '-q quiet' echo '-v Verbose' echo '' } -while getopts 'j:E:ehlqrRv' COMMAND_LINE_ARGUMENT ; do +while getopts 'dE:ehj:lqrRv' COMMAND_LINE_ARGUMENT ; do case "${COMMAND_LINE_ARGUMENT}" in - j) JAIL="${OPTARG}" ;; + d) DEBUG=dopt ;; E) VARS="${VARS} ${OPTARG}" ;; e) ENABLED=eopt ;; h) usage ; exit 0 ;; + j) JAIL="${OPTARG}" ;; l) LIST=lopt ;; q) QUIET=qopt ;; r) RCORDER=ropt ;; R) RESTART=Ropt ;; v) VERBOSE=vopt ;; *) usage ; exit 1 ;; esac done shift $(( $OPTIND - 1 )) if [ -n "${JAIL}" ]; then # We need to rebuild the command line before passing it on. # We do not send the -j argument into the jail. args="" [ -n "${ENABLED}" ] && args="${args} -e" [ -n "${LIST}" ] && args="${args} -l" [ -n "${QUIET}" ] && args="${args} -q" [ -n "${RCORDER}" ] && args="${args} -r" [ -n "${RESTART}" ] && args="${args} -R" [ -n "${VERBOSE}" ] && args="${args} -v" for var in ${VARS}; do args="${args} -E ${var}" done # Call jexec(8) with the rebuild args and any positional args that # were left in $@ /usr/sbin/jexec -l "${JAIL}" /usr/sbin/service $args "$@" exit $? fi +if [ -n "$DEBUG" ]; then + VARS="${VARS} rc_debug=yes" +fi + if [ -n "$RESTART" ]; then skip="-s nostart" if [ `/sbin/sysctl -n security.jail.jailed` -eq 1 ]; then skip="$skip -s nojail" if [ `/sbin/sysctl -n security.jail.vnet` -ne 1 ]; then skip="$skip -s nojailvnet" fi 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 if [ -n "$QUIET" ]; then checkyesno $rcvar 2>/dev/null && run_rc_script ${file} stop >/dev/null 2>&1 else checkyesno $rcvar 2>/dev/null && run_rc_script ${file} stop fi fi done for file in $files; do if grep -q ^rcvar $file; then eval `grep ^name= $file` eval `grep ^rcvar $file` if [ -n "$QUIET" ]; then checkyesno $rcvar 2>/dev/null && run_rc_script ${file} start >/dev/null 2>&1 else checkyesno $rcvar 2>/dev/null && run_rc_script ${file} start fi 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" if [ `/sbin/sysctl -n security.jail.vnet` -ne 1 ]; then skip="$skip -s nojailvnet" fi 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 0 ]; 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" if [ -n "$QUIET" ]; then exec /usr/bin/env -i -L -/daemon HOME=/ PATH=/sbin:/bin:/usr/sbin:/usr/bin ${VARS} "$dir/$script" "$@" > /dev/null 2>&1 else exec /usr/bin/env -i -L -/daemon HOME=/ PATH=/sbin:/bin:/usr/sbin:/usr/bin ${VARS} "$dir/$script" "$@" fi 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