Blob Blame History Raw
#!/bin/sh
#
# @DAEMON_NAME@	This shell script takes care of starting and stopping
#		the MySQL subsystem (mysqld).
#
# chkconfig: - 64 36
# description:	MySQL database server.
# processname: mysqld
# config: @sysconfdir@/my.cnf
# pidfile: /var/run/@DAEMON_NAME@/@DAEMON_NO_PREFIX@.pid
### BEGIN INIT INFO
# Provides: mysqld
# Required-Start: $local_fs $remote_fs $network $named $syslog $time
# Required-Stop: $local_fs $remote_fs $network $named $syslog $time
# Short-Description: start and stop MySQL server
# Description: MySQL database server
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network


exec="@bindir@/mysqld_safe"
prog="@DAEMON_NAME@"

# Set timeouts here so they can be overridden from @sysconfdir@/sysconfig/@DAEMON_NO_PREFIX@
STARTTIMEOUT=300
STOPTIMEOUT=60

# User and group the daemon will run under
MYUSER=mysql
MYGROUP=mysql

# Edit the following file in order to re-write some of the environment
# variables defined above, like $STARTTIMEOUT, $STOPTIMEOUT, $exec
[ -e @sysconfdir@/sysconfig/@DAEMON_NO_PREFIX@ ] && . @sysconfdir@/sysconfig/@DAEMON_NO_PREFIX@

lockfile=/var/lock/subsys/$prog

# get options from my.cnf
source "@libexecdir@/mysql-scripts-common"

start(){
    [ -x $exec ] || exit 5

    # check permissions
    if ! touch $(dirname $socketfile) &>/dev/null ; then
        action $"Starting $prog: " /bin/false
        return 4
    fi

    # Check if PID file exists (which should indicate, the daemon is already running)
    MYSQLDRUNNING=0
    if [ -f "$pidfile" ]; then
	MYSQLPID=`su - $MYUSER -s /bin/bash -c "cat $pidfile 2>/dev/null"`
	if [ -n "$MYSQLPID" ] && [ -d "/proc/$MYSQLPID" ] ; then
	    # Test that the read data is an integer
	    if [ 1 -ne `echo $MYSQLPID | grep -c -E "^[0-9]+$"` ] ; then
	        # Set an error value
	        MYSQLDRUNNING=2
	    else
	        MYSQLDRUNNING=1
	    fi
	fi
    fi

    # Ping the socket to check, if there's already a running server on that socket
    RESPONSE=`@bindir@/mysqladmin --no-defaults --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1`
    if [ $? = 0 ] || echo "$RESPONSE" | grep -q "Access denied for user"
        then
        if [ $MYSQLDRUNNING = 0 ]; then
            # PID file does not exist, but the server is responsive = different server, or server with different configuration, is running, fail to prevent damage
            echo "Socket already in use by a different, responding server" >&2
	    action $"Starting $prog: " /bin/false
	    return 1
        elif [ $MYSQLDRUNNING = 1 ]; then
            # PID file is valid and server is responsive = already running, do nothing
	    action $"Starting $prog: " /bin/true
	    ret=0
        elif [ $MYSQLDRUNNING = 2 ]; then
            # PID file contains garbage, but the server is responsive. Notify admin and fail.
            echo "Socket already in use by a different, responding server" >&2
            echo "PID file does not contain an integer. Please investigate." >&2
	    action $"Starting $prog: " /bin/false
	    return 1
        fi
    else
        if [ $MYSQLDRUNNING = 1 ]; then
            # If the PID file exist by any reason, but there is no response on the socket, notify the admin and fail.
            # The PID might be in use by a server which configured different socket
            echo "PID file already exists. It might belong to a living process. Please investigate." >&2
	    action $"Starting $prog: " /bin/false
	    return 1
        elif [ $MYSQLDRUNNING = 2 ]; then
            # If the PID file exist, but contains garbage, and there is no response on the socket, notify the admin and fail.
            echo "PID file already exists. However it does not contain an integer. Please investigate." >&2
	    action $"Starting $prog: " /bin/false
	    return 1
        fi

        @libexecdir@/mysql-check-socket || return 1
        # KNOWN ISSUE: Per standard, following line should return '1' on error
        #              Leaving '4' for behaviour compatibility with released versions of this script
        su - $MYUSER -s /bin/bash -c "@libexecdir@/mysql-prepare-db-dir $MYUSER $MYGROUP" || return 4

	# Pass all the options determined above, to ensure consistent behavior.
	# In many cases mysqld_safe would arrive at the same conclusions anyway
	# but we need to be sure.  (An exception is that we don't force the
	# log-error setting, since this script doesn't really depend on that,
	# and some users might prefer to configure logging to syslog.)
	# Note: set --basedir to prevent probes that might trigger SELinux
	# alarms, per bug #547485
	su - $MYUSER -s /bin/bash -c "$exec   --datadir='$datadir' --socket='$socketfile' \
		--pid-file='$pidfile' $MYSQLD_OPTS $_WSREP_NEW_CLUSTER \
		--basedir=@prefix@ --user=$MYUSER" >/dev/null 2>&1 &
	safe_pid=$!

	# Wait until the daemon is up
	su - $MYUSER -s /bin/bash -c "@libexecdir@/mysql-wait-ready '$safe_pid'"
	ret=$?

	if [ $ret -eq 0 ]; then
	    action $"Starting $prog: " /bin/true
	    chmod o+r $pidfile >/dev/null 2>&1
	    touch $lockfile
	else
	    action $"Starting $prog: " /bin/false
	fi
    fi
    return $ret
}

stop(){
	if [ ! -f "$pidfile" ]; then
	    # not running; per LSB standards this is "ok"
	    action $"Stopping $prog: " /bin/true
	    return 0
	fi

	MYSQLPID=`su - $MYUSER -s /bin/bash -c "cat $pidfile 2>/dev/null"`

	# Test that the read data is an integer
	if [ 1 -ne `echo $MYSQLPID | grep -c -E "^[0-9]+$"` ] ; then
	    echo "PIDfile does not contain a number. Please investigate." >&2
	    action $"Stopping $prog: " /bin/false
	    return 1
	fi

	if [ -n "$MYSQLPID" ]; then
	    if ! [ -d "/proc/$MYSQLPID" ] ; then
		# process doesn't run anymore
		action $"Stopping $prog: " /bin/true
		return 0
	    fi
	    # Drop priviledges before calling kill
	    su - $MYUSER -s /bin/bash -c "/bin/kill $MYSQLPID" >/dev/null 2>&1
	    ret=$?
	    if [ $ret -eq 0 ]; then
		TIMEOUT="$STOPTIMEOUT"
		while [ $TIMEOUT -gt 0 ]; do
		    # Drop priviledges before calling kill
		    su - $MYUSER -s /bin/bash -c "/bin/kill -0 $MYSQLPID" >/dev/null 2>&1 || break
		    sleep 1
		    let TIMEOUT=${TIMEOUT}-1
		done
		if [ $TIMEOUT -eq 0 ]; then
		    echo "Timeout error occurred trying to stop MySQL Daemon."
		    ret=1
		    action $"Stopping $prog: " /bin/false
		else
		    rm -f $lockfile
		    rm -f "$socketfile"
		    action $"Stopping $prog: " /bin/true
		fi
	    else
		# kill command failed, probably insufficient permissions
		action $"Stopping $prog: " /bin/false
		ret=4
	    fi
	else
	    # failed to read pidfile, probably insufficient permissions
	    action $"Stopping $prog: " /bin/false
	    ret=4
	fi
	return $ret
}
 
restart(){
    stop
    start
}

condrestart(){
    [ -e $lockfile ] && restart || :
}


# See how we were called.
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
    status -p "$pidfile" $prog
    ;;
  restart)
    restart
    ;;
  condrestart|try-restart)
    condrestart
    ;;
  reload)
    exit 3
    ;;
  force-reload)
    restart
    ;;
  *)
    echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
    exit 2
esac

exit $?