#!/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 $?