summaryrefslogtreecommitdiff
path: root/scripts/mysqld_safe-watch.sh
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/mysqld_safe-watch.sh')
-rw-r--r--scripts/mysqld_safe-watch.sh150
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"