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