| #!/bin/sh |
| # |
| # Licensed to the Apache Software Foundation (ASF) under one or more |
| # contributor license agreements. See the NOTICE file distributed with |
| # this work for additional information regarding copyright ownership. |
| # The ASF licenses this file to You under the Apache License, Version 2.0 |
| # (the "License"); you may not use this file except in compliance with |
| # the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| # chkconfig: - 90 10 |
| # description: Apache Traffic Server is a fast, scalable and extensible \ |
| # HTTP/1.1 compliant caching proxy server. |
| # processname: traffic_manager traffic_server |
| # config: /etc/trafficserver |
| # config: /etc/sysconfig/trafficserver |
| # |
| # Template from /etc/init.d/skeleton on Ubuntu |
| # |
| ### BEGIN INIT INFO |
| # Provides: Traffic Server |
| # Required-Start: $local_fs $remote_fs |
| # Required-Stop: $local_fs $remote_fs |
| # Default-Start: 2 3 4 5 |
| # Default-Stop: S 0 1 6 |
| # Short-Description: Startup/shutdown script for the Apache Traffic Server |
| # Description: Apache Traffic Server is fast, scalable and extensible |
| # HTTP/1.1 compliant caching proxy server. |
| ### END INIT INFO |
| |
| # Fedora: |
| # When this file is installed as /etc/rc.d/init.d/trafficserver |
| # and added to the chkconfig system with `chkconfig --add trafficserver` |
| # then the default values of these variables can be overridden |
| # in the /etc/sysconfig/trafficserver file |
| # Ubuntu: |
| # Values read from /etc/default/trafficserver |
| |
| TS_PACKAGE_NAME="@PACKAGE_NAME@" |
| TS_PACKAGE_VERSION="@PACKAGE_VERSION@" |
| TS_PACKAGE_BUGREPORT="@PACKAGE_BUGREPORT@" |
| UNAME_S=$(uname -s) |
| |
| if [ -e /etc/SuSE-release ]; then |
| DISTRIB_ID="suse" |
| elif [ -e /etc/fedora-release ]; then |
| DISTRIB_ID="fedora" |
| elif [ -e /etc/gentoo-release ]; then |
| DISTRIB_ID="gentoo" |
| elif [ -e /etc/redhat-release ]; then |
| DISTRIB_ID="redhat" # also exists on Fedora |
| elif [ -e /etc/lsb-release ]; then |
| DISTRIB_ID="ubuntu" |
| elif [ -e /etc/debian_version ]; then |
| DISTRIB_ID="debian" # also exists on Ubuntu |
| elif [ -e /etc/slackware-version ]; then |
| DISTRIB_ID="slackware" |
| elif [ "$UNAME_S" = "Darwin" ]; then |
| DISTRIB_ID="Darwin" |
| elif [ "$UNAME_S" = "FreeBSD" ]; then |
| DISTRIB_ID="FreeBSD" |
| fi |
| |
| # We might want to move over to use /etc/system-release for more distros? |
| # I know at least Fedora supports it as well. |
| if [ "" = "$DISTRIB_ID" -a -e /etc/system-release ]; then |
| case $(cat /etc/system-release) in |
| *Amazon*) |
| DISTRIB_ID="redhat" # Amazon AMI is mostly like RHEL |
| ;; |
| *) |
| ;; |
| esac |
| fi |
| |
| # /usr/bin/lsb_release -rd # Ubuntu release & description info |
| |
| HEAD=/usr/bin/head |
| test -x $HEAD || HEAD=head |
| ESED=/usr/bin/sed |
| test -x $ESED || ESED=sed |
| |
| # Ubuntu: Do NOT "set -e" |
| |
| #Ubuntu:PATH should only include /usr/* if it runs after the mountnfs.sh script |
| PATH=/usr/sbin:/usr/bin:/sbin:/bin |
| DESC="start/stop Traffic Server" |
| NAME=trafficserver |
| SLEEP_TIME=5 |
| TS_PREFIX="@prefix@" |
| |
| TS_ROOT=${TS_ROOT:-$TS_PREFIX} |
| |
| # #################################### |
| # run root is not used by default |
| # set this value if using a custom layout structure |
| # TS_RUNROOT="" |
| |
| # TS_BASE is offset inside the file system from where the layout starts |
| # For standard installations TS_BASE will be empty |
| eval TS_BASE="`echo $TS_ROOT | ${ESED} -e 's;@prefix@$;;'`" |
| |
| TM_NAME=${TM_NAME:-traffic_manager} |
| TS_NAME=${TS_NAME:-traffic_server} |
| TM_DAEMON=${TM_DAEMON:-$TS_BASE@exp_bindir@/traffic_manager} |
| TM_DAEMON_ARGS="" |
| TS_DAEMON=${TS_DAEMON:-$TS_BASE@exp_bindir@/traffic_server} |
| TS_DAEMON_ARGS="" |
| TL_BINARY=${TL_BINARY:-$TS_BASE@exp_bindir@/traffic_ctl} |
| TY_BINARY=${TL_BINARY:-$TS_BASE@exp_bindir@/traffic_layout} |
| TM_PIDFILE=${TM_PIDFILE:-$TS_BASE@exp_runtimedir@/manager.lock} |
| TS_PIDFILE=${TS_PIDFILE:-$TS_BASE@exp_runtimedir@/server.lock} |
| # number of times to retry check on pid lock file |
| PIDFILE_CHECK_RETRIES=${PIDFILE_CHECK_RETRIES:-30} |
| # stdout file of executable |
| STDOUTLOG=${STDOUTLOG:-$TS_BASE@exp_logdir@/traffic.out} |
| # stderr file of executable |
| STDERRLOG=${STDERRLOG:-$TS_BASE@exp_logdir@/traffic.out} |
| # hooks |
| RC_START_HOOK=${RC_START_HOOK:-$TS_BASE@exp_bindir@/rc_start_hook.sh} |
| RC_RELOAD_HOOK=${RC_PRELOAD_HOOK:-$TS_BASE@exp_bindir@/rc_reload_hook.sh} |
| |
| if [ -d /etc/rc.d/init.d ]; then |
| SCRIPTNAME=/etc/rc.d/init.d/$NAME # Fedora |
| elif [ -d /etc/init.d ]; then |
| SCRIPTNAME=/etc/init.d/$NAME # Ubuntu |
| elif [ "$DISTRIB_ID" = "Darwin" ]; then |
| SCRIPTNAME=$0 # Darwin |
| elif [ "$DISTRIB_ID" = "FreeBSD" ]; then |
| SCRIPTNAME=$0 # FreeBSD |
| else |
| echo "This script needs to be ported to this OS" |
| exit 1 |
| fi |
| |
| # Exit if the package can not be found |
| if [ ! -x "$TS_DAEMON" ]; then |
| echo "Error: Can not find $TS_DAEMON using TS_ROOT=$TS_ROOT" |
| echo " Please set TS_ROOT to point to base installation." |
| exit 0 |
| fi |
| |
| # Ubuntu: Read configuration variable file if it is present |
| test -r /etc/default/$NAME && . /etc/default/$NAME |
| |
| # RHEL/Fedora: Read configuration variable file if it is present |
| test -r /etc/sysconfig/$NAME && . /etc/sysconfig/$NAME |
| |
| # Gentoo: Read configuration variable file if it is present |
| test -r /etc/conf.d/$NAME && . /etc/conf.d/$NAME |
| |
| # Ubuntu: Load the VERBOSE setting and other rcS variables |
| test -f /etc/default/rcS && . /etc/default/rcS |
| |
| # Suse: load rc.status |
| test -f /etc/rc.status && . /etc/rc.status |
| |
| # Fedora: make avail helper functions 'action', 'killproc', 'status', etc |
| test -f /etc/rc.d/init.d/functions && . /etc/rc.d/init.d/functions |
| |
| # Gentoo: make avail helper function 'ebegin', 'eend', etc |
| test -f /etc/init.d/functions.sh && . /etc/init.d/functions.sh |
| |
| # Ubuntu: Define LSB log_* functions. |
| # Depend on lsb-base (>= 3.0-6) to ensure that this file is present. |
| test -f /lib/lsb/init-functions && . /lib/lsb/init-functions |
| |
| # FreeBSD |
| # NB: FreeBSD's ports system installs a run script in /usr/local/etc/rc.d/ |
| # with native OS rc.subr(8) features. |
| test -f /etc/rc.subr && . /etc/rc.subr |
| |
| if [ ! -d $TS_BASE@exp_runtimedir@ ]; then |
| mkdir -p $TS_BASE@exp_runtimedir@ |
| chown @pkgsysuser@:@pkgsysgroup@ $TS_BASE@exp_runtimedir@ |
| fi |
| |
| # |
| # Fedora: |
| # launches $* in the background |
| # and checks if program creates its own pid lock file |
| # redirects stdout and stderr to files |
| # this function is meant to substitute 'daemon' |
| # because 'daemon' expects $1 to fork itself |
| forkdaemon() |
| { |
| local i=0 |
| |
| # launch in background, i.e. fork |
| # and redirect stdout and stderr to files |
| $* --bind_stdout $STDOUTLOG --bind_stderr $STDERRLOG >> $STDOUTLOG 2>> $STDERRLOG & |
| |
| while (( $i < $PIDFILE_CHECK_RETRIES )) |
| do |
| # check for regular file and size greater than 0 |
| if [[ -f $TM_PIDFILE ]] && [[ -s $TM_PIDFILE ]]; then |
| success |
| return 0 |
| fi |
| |
| sleep 1 # zzz for 1 second |
| (( i++ )) |
| |
| done |
| |
| failure |
| return 1 |
| } |
| |
| |
| # |
| # Ubuntu: Function that starts the daemon/service |
| # |
| do_start() |
| { |
| # Return |
| # 0 if daemon has been started |
| # 1 if daemon was already running |
| # 2 if daemon could not be started |
| start-stop-daemon --start --quiet --pidfile $TM_PIDFILE --exec $TM_DAEMON --test > /dev/null \ |
| || return 1 |
| start-stop-daemon --start --background --quiet --pidfile $TM_PIDFILE --exec $TM_DAEMON -- \ |
| $TM_DAEMON_ARGS \ |
| || return 2 |
| # Add code here, if necessary, that waits for the process to be ready |
| # to handle requests from services started subsequently which depend |
| # on this one. As a last resort, sleep for some time. |
| sleep 1 |
| test -f "$TM_PIDFILE" || return 2 |
| } |
| |
| # |
| # Ubuntu: Function that stops the daemon/service |
| # |
| do_stop() |
| { |
| # Return |
| # 0 if daemon has been stopped |
| # 1 if daemon was already stopped |
| # 2 if daemon could not be stopped |
| # other if a failure occurred |
| start-stop-daemon --stop --quiet --retry=QUIT/30/KILL/5 --pidfile $TM_PIDFILE --name $TM_NAME |
| RETVAL="$?" |
| test "$RETVAL" != 0 && return $RETVAL |
| # Wait for children to finish too if this is a daemon that forks |
| # and if the daemon is only ever run from this initscript. |
| # If the above conditions are not satisfied then add some other code |
| # that waits for the process to drop all resources that could be |
| # needed by services started subsequently. A last resort is to |
| # sleep for some time. |
| start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $TM_DAEMON |
| RETVAL="$?" |
| test "$RETVAL" != 0 && return $RETVAL |
| # Need to stop the TM and TS also |
| start-stop-daemon --stop --quiet --oknodo --retry=QUIT/30/KILL/5 --pidfile $TM_PIDFILE --name $TM_NAME |
| RETVAL="$?" |
| test "$RETVAL" != 0 && return $RETVAL |
| start-stop-daemon --stop --quiet --oknodo --retry=QUIT/30/KILL/5 --pidfile $TS_PIDFILE --name $TS_NAME |
| RETVAL="$?" |
| test "$RETVAL" != 0 && return $RETVAL |
| # Many daemons don't delete their pidfiles when they exit. |
| rm -f $TM_PIDFILE |
| rm -f $TM_PIDFILE |
| rm -f $TS_PIDFILE |
| return "$RETVAL" |
| } |
| |
| rc_reload_hook() |
| { |
| if [ ! -x "$RC_RELOAD_HOOK" ]; then |
| return 0 |
| fi |
| sh $RC_RELOAD_HOOK |
| return $? |
| } |
| |
| rc_start_hook() |
| { |
| if [ ! -x "$RC_START_HOOK" ]; then |
| return 0 |
| fi |
| sh $RC_START_HOOK |
| return $? |
| } |
| |
| # Make sure the NOFILES limit is set high in case this process is not |
| # started from a logged in prompt |
| ulimit -n 500000 |
| |
| # main |
| case "$1" in |
| start) |
| rc_start_hook |
| retval="$?" |
| if [ "$retval" != 0 ]; then |
| echo "precondition was not met: ${RC_START_HOOK}" |
| exit "$retval" |
| fi |
| |
| if [ "$DISTRIB_ID" = "ubuntu" -o "$DISTRIB_ID" = "debian" ] ; then |
| test "x$VERBOSE" != "xno" && log_daemon_msg "Starting ${TS_PACKAGE_NAME}" "$NAME" |
| retval=0 |
| do_start |
| test "$?" -ne 0 -a "$?" -ne 1 && retval=1 |
| test "x$VERBOSE" != "xno" && log_end_msg "$retval" |
| exit "$retval" |
| elif [ "$DISTRIB_ID" = "gentoo" ]; then |
| ebegin "Starting ${TS_PACKAGE_NAME}" |
| do_start |
| eend $? |
| elif [ "$DISTRIB_ID" = "fedora" -o "$DISTRIB_ID" = "redhat" ]; then |
| action "Starting ${TS_PACKAGE_NAME}:" forkdaemon $TM_DAEMON $TM_DAEMON_ARGS |
| elif [ "$DISTRIB_ID" = "suse" ]; then |
| echo -n "Starting ${TS_PACKAGE_NAME}" |
| startproc -p $TM_PIDFILE $TM_DAEMON $TM_DAEMON_ARGS |
| rc_status -v |
| elif [ "$DISTRIB_ID" = "Darwin" ]; then |
| echo "Starting ${TS_PACKAGE_NAME}" |
| launchctl bsexec / launchctl list $TM_NAME > /dev/null 2>&1 && exit 0 |
| launchctl bsexec / launchctl submit -l $TM_NAME -p $TM_DAEMON -o $STDOUTLOG -e $STDERRLOG -- $TM_DAEMON_ARGS |
| elif [ "$DISTRIB_ID" = "FreeBSD" ]; then |
| echo "Starting ${TS_PACKAGE_NAME}" |
| name="$TM_NAME" |
| command="/usr/sbin/daemon" |
| command_args="-o $STDOUTLOG $TM_DAEMON $TM_DAEMON_ARGS" |
| pidfile="$TM_PIDFILE" |
| run_rc_command "$1" |
| else |
| echo "This script needs to be ported to this OS" |
| exit 1 |
| fi |
| ;; |
| stop) |
| if [ "$DISTRIB_ID" = "ubuntu" -o "$DISTRIB_ID" = "debian" ] ; then |
| test "x$VERBOSE" != "xno" && log_daemon_msg "Stopping ${TS_PACKAGE_NAME}" "$NAME" |
| retval=0 |
| do_stop |
| test "$?" -ne 0 -a "$?" -ne 1 && retval=1 |
| test "x$VERBOSE" != "xno" && log_end_msg "$retval" |
| exit "$retval" |
| elif [ "$DISTRIB_ID" = "fedora" -o "$DISTRIB_ID" = "redhat" ]; then |
| action "Stopping ${TM_NAME}:" killproc -p $TM_PIDFILE -d 35 $TM_DAEMON |
| action "Stopping ${TS_NAME}:" killproc -p $TS_PIDFILE -d 35 $TS_DAEMON |
| elif [ "$DISTRIB_ID" = "gentoo" ]; then |
| ebegin "Starting ${TS_PACKAGE_NAME}" |
| do_stop |
| eend $? |
| elif [ "$DISTRIB_ID" = "suse" ]; then |
| echo -n "Stopping ${TM_NAME}" |
| killproc -p $TM_PIDFILE $TM_DAEMON |
| rc_status -v |
| echo -n "Stopping ${TS_NAME}" |
| killproc -p $TS_PIDFILE $TS_DAEMON |
| rc_status -v |
| elif [ "$DISTRIB_ID" = "Darwin" ]; then |
| echo "Stopping ${TS_PACKAGE_NAME}" |
| launchctl bsexec / launchctl list $TM_NAME > /dev/null 2>&1 || exit 0 |
| echo "Stopping ${TM_NAME}" |
| launchctl bsexec / launchctl remove ${TM_NAME} |
| rm -f ${TM_PIDFILE} |
| echo "Stopping ${TS_NAME}" |
| kill $(cat $TS_PIDFILE) |
| rm -f ${TS_PIDFILE} |
| elif [ "$DISTRIB_ID" = "FreeBSD" ]; then |
| echo "Stopping ${TS_PACKAGE_NAME}" |
| if [ -e "$TM_PIDFILE" ]; then |
| kill $(cat $TM_PIDFILE) |
| rm -f ${TM_PIDFILE} |
| fi |
| else |
| echo "This script needs to be ported to this OS" |
| exit 1 |
| fi |
| ;; |
| reload|force-reload) |
| rc_reload_hook |
| retval="$?" |
| if [ "$retval" != 0 ]; then |
| echo "precondition was not met: ${RC_RELOAD_HOOK}" |
| exit "$retval" |
| fi |
| |
| if [ "$DISTRIB_ID" = "ubuntu" -o "$DISTRIB_ID" = "debian" ] ; then |
| test "x$VERBOSE" != "xno" && log_daemon_msg "Reloading ${TS_PACKAGE_NAME}" "$NAME" |
| retval=0 |
| $TL_BINARY config reload |
| test "$?" -ne 0 -a "$?" -ne 1 && retval=1 |
| test "x$VERBOSE" != "xno" && log_end_msg "$retval" |
| exit "$retval" |
| elif [ "$DISTRIB_ID" = "fedora" -o "$DISTRIB_ID" = "redhat" ]; then |
| action "Reloading ${NAME}:" $TL_BINARY config reload |
| elif [ "$DISTRIB_ID" = "gentoo" ]; then |
| ebegin "Reloading ${NAME}" |
| $TL_BINARY config reload |
| eend $? |
| elif [ "$DISTRIB_ID" = "suse" ]; then |
| echo -n "Reloading ${NAME}" |
| $TL_BINARY config reload |
| rc_status -v |
| elif [ "$DISTRIB_ID" = "Darwin" ]; then |
| echo "Reloading ${NAME}" |
| $TL_BINARY config reload |
| elif [ "$DISTRIB_ID" = "FreeBSD" ]; then |
| echo "Reloading ${NAME}" |
| $TL_BINARY config reload |
| else |
| echo "This script needs to be ported to this OS" |
| exit 1 |
| fi |
| ;; |
| restart) |
| if [ "$DISTRIB_ID" = "ubuntu" -o "$DISTRIB_ID" = "debian" ] ; then |
| # |
| # If the "reload" option is implemented then remove the |
| # 'force-reload' alias |
| # |
| log_daemon_msg "Restarting ${TS_PACKAGE_NAME}" "$NAME" |
| do_stop |
| case "$?" in |
| 0|1) |
| sleep $SLEEP_TIME |
| do_start |
| case "$?" in |
| 0) log_end_msg 0 ;; |
| 1) log_end_msg 0 ;; # Daemons were already stopped |
| *) log_end_msg 1 ;; # Failed to start |
| esac |
| ;; |
| *) |
| # Failed to stop |
| log_end_msg 1 |
| ;; |
| esac |
| else |
| # This is the typical process for restart |
| sh $0 'stop' |
| sleep $SLEEP_TIME |
| sh $0 'start' |
| fi |
| ;; |
| status) |
| if [ "$DISTRIB_ID" = "fedora" -o "$DISTRIB_ID" = "redhat" ]; then |
| status -p $TM_PIDFILE $TM_NAME |
| elif [ "$DISTRIB_ID" = "ubuntu" -o "$DISTRIB_ID" = "debian" ] ; then |
| status_of_proc "$TM_DAEMON" "$TM_NAME" -p "$TM_PIDFILE" && exit 0 || exit $? |
| elif [ "$DISTRIB_ID" = "suse" ]; then |
| echo -n "Checking for service ${DM}: " |
| checkproc -p $TM_PIDFILE $TM_NAME |
| rc_status -v |
| elif [ "$DISTRIB_ID" = "Darwin" ]; then |
| /bin/echo -n "${TS_PACKAGE_NAME} is " |
| launchctl bsexec / launchctl list $TM_NAME > /dev/null 2>&1 |
| status=$? |
| [ $status -eq 0 ] || /bin/echo -n "not " |
| echo "running." |
| elif [ "$DISTRIB_ID" = "FreeBSD" -o "$DISTRIB_ID" = "gentoo" ]; then |
| if pgrep $TM_NAME > /dev/null ; then |
| echo "$TM_NAME running as pid `cat $TM_PIDFILE`" ; else |
| echo "$TM_NAME not running" |
| fi |
| if pgrep $TS_NAME > /dev/null ; then |
| echo "$TS_NAME running as pid `cat $TS_PIDFILE`"; else |
| echo "$TS_NAME not running" |
| fi |
| exit $status |
| else |
| echo "This script needs to be ported to this OS" |
| exit 1 |
| fi |
| ;; |
| condrestart) |
| if [ "$DISTRIB_ID" = "fedora" -o "$DISTRIB_ID" = "redhat" ]; then |
| if $0 'status' |
| then |
| sh $0 'stop' |
| sh $0 'start' |
| fi |
| else |
| echo "This script needs to be ported to this OS" |
| exit 1 |
| fi |
| ;; |
| *) |
| if [ "$DISTRIB_ID" = "ubuntu" -o "$DISTRIB_ID" = "debian" ] ; then |
| echo "Usage: $SCRIPTNAME {start|stop|status|restart}" >&2 |
| elif [ "$DISTRIB_ID" = "fedora" -o "$DISTRIB_ID" = "redhat" ]; then |
| echo "Usage: $0 {start|stop|status|restart|condrestart}" |
| elif [ "$DISTRIB_ID" = "gentoo" ]; then |
| echo "Usage: $0 {start|stop|reload|restart|status}" |
| elif [ "$DISTRIB_ID" = "suse" ]; then |
| echo "Usage: $0 {start|stop|restart|status}" |
| elif [ "$DISTRIB_ID" = "Darwin" ]; then |
| echo "Usage: $0 {start|stop|restart|status}" |
| elif [ "$DISTRIB_ID" = "FreeBSD" ]; then |
| echo "Usage: $0 Usage: (start|stop|restart|status)" |
| echo "NB: FreeBSD's ports system installs a rc script in" |
| echo "/usr/local/etc/rc.d/ with native rc.subr(8) features." |
| else |
| echo "This script needs to be ported to this OS" |
| exit 1 |
| fi |
| exit 3 |
| ;; |
| esac |