diff options
Diffstat (limited to 'scripts/mysqld_safe-watch.sh')
-rw-r--r-- | scripts/mysqld_safe-watch.sh | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/scripts/mysqld_safe-watch.sh b/scripts/mysqld_safe-watch.sh new file mode 100644 index 00000000000..c59b3b2614d --- /dev/null +++ b/scripts/mysqld_safe-watch.sh @@ -0,0 +1,150 @@ +#!/bin/sh +# Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB +# This file is public domain and comes with NO WARRANTY of any kind +# +# scripts to start the MySQL demon and restart it if it dies unexpectedly +# +# This should be executed in the MySQL base directory if you are using a +# binary installation that has other paths than you are using. +# +# mysql.server works by first doing a cd to the base directory and from there +# executing mysqld_safe + +# Check if we are starting this relative (for the binary release) +if test -f ./data/mysql/db.frm -a -f ./share/mysql/english/errmsg.sys -a \ + -x ./bin/mysqld +then + MY_BASEDIR_VERSION=`pwd` # Where bin, share and data is + DATADIR=$MY_BASEDIR_VERSION/data # Where the databases are + ledir=$MY_BASEDIR_VERSION/bin # Where mysqld are +# Check if this is a 'moved install directory' +elif test -f ./var/mysql/db.frm -a -f ./share/mysql/english/errmsg.sys -a \ + -x ./libexec/mysqld +then + MY_BASEDIR_VERSION=`pwd` # Where libexec, share and var is + DATADIR=$MY_BASEDIR_VERSION/var # Where the databases are + ledir=$MY_BASEDIR_VERSION/libexec # Where mysqld are +else + MY_BASEDIR_VERSION=/usr/local/mysql + DATADIR=/usr/local/mysql/var + ledir=/usr/local/mysql/libexec +fi + +hostname=`@HOSTNAME@` +pidfile=$DATADIR/$hostname.pid +log=$DATADIR/$hostname.log +err=$DATADIR/$hostname.err +lockfile=$DATADIR/$hostname.lock + +# +# If there exists an old pid file, check if the demon is already running +# Note: The switches to 'ps' may depend on your operating system + +if test -f $pidfile +then + PID=`cat $pidfile` + if /bin/kill -0 $PID + then + if /bin/ps -p $PID | grep mysqld > /dev/null + then # The pid contains a mysqld process + echo "A mysqld process already exists" + echo "A mysqld process already exists at " `date` >> $log + exit 1; + fi + fi + rm -f $pidfile + if test -f $pidfile + then + echo "Fatal error: Can't remove the pid file: $pidfile" + echo "Fatal error: Can't remove the pid file: $pidfile at " `date` >> $log + echo "Please remove it manually and start $0 again" + echo "mysqld demon not started" + exit 1; + fi +fi + +echo "Starting mysqld demon with databases from $DATADIR" + +#Default communication ports +#MYSQL_TCP_PORT=3306 +if test -z "$MYSQL_UNIX_PORT" +then + MYSQL_UNIX_PORT="/tmp/mysql.sock" + export MYSQL_UNIX_PORT +fi +#export MYSQL_TCP_PORT + +# Does this work on all systems? +#if type ulimit | grep "shell builtin" > /dev/null +#then +# ulimit -n 256 > /dev/null 2>&1 # Fix for BSD and FreeBSD systems +#fi + +echo "mysqld started on " `date` >> $log +bin/zap -f $lockfile < /dev/null > /dev/null 2>&1 +rm -f $lockfile +$MY_BASEDIR_VERSION/bin/watchdog_mysqld $lockfile $pidfile $MY_BASEDIR_VERSION/bin $DATADIR 3 10 >> $err 2>&1 & +restart_pid=$! + +while true +do + rm -f $MYSQL_UNIX_PORT $pidfile # Some extra safety + lockfile -1 -r10 $lockfile >/dev/null 2>&1 + if test "$#" -eq 0 + then + nohup $ledir/mysqld --basedir=$MY_BASEDIR_VERSION --datadir=$DATADIR \ + --skip-locking >> $err 2>&1 & + else + nohup $ledir/mysqld --basedir=$MY_BASEDIR_VERSION --datadir=$DATADIR \ + --skip-locking "$@" >> $err 2>&1 & + fi + pid=$! + rm -f $lockfile + wait $pid; + + lockfile -1 -r10 $lockfile >/dev/null 2>&1 + rm -f $lockfile + if test ! -f $pidfile # This is removed if normal shutdown + then + break; + fi + if true + then + # Test if one proces was hanging. + # This is only a fix for Linux (running as base 3 mysqld processes) + # but should work for the rest of the servers. + # The only thing is ps x => redhat 5 gives warnings when using ps -x. + # kill -9 is used or the proces won't react on the kill. + numofproces=`ps x | grep -v "grep" | grep -c $ledir/mysqld` + echo -e "\nNumber of processes running now: $numofproces" | tee -a $log + I=1 + while test "$I" -le "$numofproces" + do + PROC=`ps x | grep $ledir/mysqld | grep -v "grep" | tail -1` + for T in $PROC + do + break + done + # echo "TEST $I - $T **" + if kill -9 $T + then + echo "mysqld proces hanging, pid $T - killed" | tee -a $log + else + break + fi + I=`expr $I + 1` + done + fi + echo "mysqld restarted" | tee -a $log + # Check all tables and repair any wrong tables. + $MY_BASEDIR_VERSION/bin/isamchk -sf $DATADIR/*/*.ISM >> $err 2>&1 +done +if test $restart_pid -gt 0 +then + kill $restart_pid > /dev/null 2>&1 + sleep 1; + kill -9 $restart_pid > /dev/null 2>&1 +fi + +echo -n "mysqld ended on " `date` >> $log +echo "mysqld demon ended" |