Below is the list of changes that have just been committed into a local
5.1 repository of tsmith. When tsmith does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet@stripped, 2007-05-04 19:06:36-06:00, tsmith@stripped +1 -0
mysqld_safe.sh: Overhaul the logging design, to allow logging
mysqld messages to syslog. Add --syslog and --skip-syslog
arguments for mysqld_safe.
scripts/mysqld_safe.sh@stripped, 2007-05-04 19:06:29-06:00, tsmith@stripped +153 -102
Overhaul the logging design, to allow logging mysqld messages to syslog.
Add two new options: --syslog and --skip-syslog. --syslog is the default,
unless --log-error is also specified.
If --log-error is specified (for mysqld_safe, mysqld, server, etc. - any
group which mysqld_safe checks for arguments), then syslog is turned off.
This is because mysqld will get the --log-error argument and log to a file
anyways, which will be confusing to the user. If the user requests both
--syslog and --log-error, a warning is printed (to mysqld_safe's stderr and
to syslog), and we then behave as if --skip-syslog had been specified.
Also, logging messages have been normalized somewhat: mysqld_safe now always
prefixes messages with '<TIMESTAMP> mysqld_safe '. All messages go to the
the console (stdout or stderr, depending on if it's a notice or an error) and
to (the error log OR syslog).
Also, a few cleanups while I'm here.
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: tsmith
# Host: siva.hindu.god
# Root: /home/tsmith/m/bk/maint/b4858/51
--- 1.87/scripts/mysqld_safe.sh 2006-12-15 03:21:40 -07:00
+++ 1.88/scripts/mysqld_safe.sh 2007-05-04 19:06:29 -06:00
@@ -2,16 +2,23 @@
# 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 daemon and restart it if it dies unexpectedly
+# Script to start the MySQL daemon 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.
+# binary installation that is not installed in its compile-time default
+# location
#
# mysql.server works by first doing a cd to the base directory and from there
# executing mysqld_safe
KILL_MYSQLD=1;
MYSQLD=
+niceness=0
+# Default on, unless --log-err is specified (and before options are parsed)
+syslog=2
+user=@MYSQLD_USER@
+pid_file=
+err_log=
trap '' 1 2 3 15 # we shouldn't let anyone kill us
@@ -38,6 +45,8 @@ Usage: $0 [OPTIONS]
--mysqld-version=VERSION Use "mysqld-VERSION" as mysqld
--nice=NICE Set the scheduling priority of mysqld
--skip-kill-mysqld Don't try to kill stray mysqld processes
+ --syslog Log messages to syslog with 'logger'
+ --skip-syslog Log messages to error log
All other options are passed to the mysqld program.
@@ -45,6 +54,43 @@ EOF
exit 1
}
+log_generic () {
+ priority="$1"
+ shift
+
+ msg="`date +'%y%m%d %H:%M:%S'` mysqld_safe $*"
+ echo "$msg"
+ if [ $syslog -eq 0 ]
+ then
+ echo "$msg" >> "$err_log"
+ else
+ logger -i -t mysqld_safe -p "$priority" "$*"
+ fi
+}
+
+log_error () {
+ log_generic daemon.error "$@" >&2
+}
+
+log_notice () {
+ log_generic daemon.notice "$@"
+}
+
+eval_log_error () {
+ cmd="$1"
+ if [ $syslog -eq 0 ]
+ then
+ cmd="$cmd >> "`shell_quote_string "$err_log"`" 2>&1"
+ else
+ # mysqld often (not always) prefixes messages on stdout with a
+ # timestamp in the form of '%y%m%d %H:%M:%S '; this is redundant
+ # when logging via syslog, so strip it
+ cmd="$cmd 2>&1 | sed -e 's/^[0-9]\{6\} [0-9:]\{8\} *//' | logger -i -t mysqld
-p daemon.error"
+ fi
+ #echo "Running mysqld: [$cmd]"
+ eval "$cmd"
+}
+
shell_quote_string() {
# This sed command makes sure that any special chars are quoted,
# so the arg gets passed exactly to the server.
@@ -63,41 +109,41 @@ parse_arguments() {
fi
for arg do
+ val=`echo "$arg" | sed -e "s;--[^=]*=;;"`
case "$arg" in
- --skip-kill-mysqld*)
- KILL_MYSQLD=0;
- ;;
# these get passed explicitly to mysqld
- --basedir=*) MY_BASEDIR_VERSION=`echo "$arg" | sed -e "s;--basedir=;;"` ;;
- --datadir=*) DATADIR=`echo "$arg" | sed -e "s;--datadir=;;"` ;;
- --pid-file=*) pid_file=`echo "$arg" | sed -e "s;--pid-file=;;"` ;;
- --user=*) user=`echo "$arg" | sed -e "s;--[^=]*=;;"` ; SET_USER=1 ;;
+ --basedir=*) MY_BASEDIR_VERSION="$val" ;;
+ --datadir=*) DATADIR="$val" ;;
+ --pid-file=*) pid_file="$val" ;;
+ --user=*) user="$val"; SET_USER=1 ;;
# these might have been set in a [mysqld_safe] section of my.cnf
# they are added to mysqld command line to override settings from my.cnf
- --log-error=*) err_log=`echo "$arg" | sed -e "s;--log-error=;;"` ;;
- --socket=*) mysql_unix_port=`echo "$arg" | sed -e "s;--socket=;;"` ;;
- --port=*) mysql_tcp_port=`echo "$arg" | sed -e "s;--port=;;"` ;;
+ --log-error=*) err_log="$val" ;;
+ --port=*) mysql_tcp_port="$val" ;;
+ --socket=*) mysql_unix_port="$val" ;;
# mysqld_safe-specific options - must be set in my.cnf ([mysqld_safe])!
- --ledir=*) ledir=`echo "$arg" | sed -e "s;--ledir=;;"` ;;
- --open-files-limit=*) open_files=`echo "$arg" | sed -e "s;--open-files-limit=;;"`
;;
- --core-file-size=*) core_file_size=`echo "$arg" | sed -e "s;--core-file-size=;;"`
;;
- --timezone=*) TZ=`echo "$arg" | sed -e "s;--timezone=;;"` ; export TZ; ;;
- --mysqld=*) MYSQLD=`echo "$arg" | sed -e "s;--mysqld=;;"` ;;
+ --core-file-size=*) core_file_size="$val" ;;
+ --ledir=*) ledir="$val" ;;
+ --mysqld=*) MYSQLD="$val" ;;
--mysqld-version=*)
- tmp=`echo "$arg" | sed -e "s;--mysqld-version=;;"`
- if test -n "$tmp"
- then
- MYSQLD="mysqld-$tmp"
- else
- MYSQLD="mysqld"
- fi
- ;;
- --nice=*) niceness=`echo "$arg" | sed -e "s;--nice=;;"` ;;
- --help)
- usage
+ if test -n "$val"
+ then
+ MYSQLD="mysqld-$val"
+ else
+ MYSQLD="mysqld"
+ fi
;;
+ --nice=*) niceness="$val" ;;
+ --open-files-limit=*) open_files="$val" ;;
+ --skip-kill-mysqld*) KILL_MYSQLD=0 ;;
+ --syslog) syslog=1 ;;
+ --skip-syslog) syslog=0 ;;
+ --timezone=*) TZ="$val"; export TZ; ;;
+
+ --help) usage ;;
+
*)
if test -n "$pick_args"
then
@@ -120,8 +166,7 @@ then
MY_BASEDIR_VERSION=$MY_PWD # Where bin, share and data are
ledir=$MY_BASEDIR_VERSION/bin # Where mysqld is
# Check for the directories we would expect from a source install
-elif test -f ./share/mysql/english/errmsg.sys -a \
- -x ./libexec/mysqld
+elif test -f ./share/mysql/english/errmsg.sys -a -x ./libexec/mysqld
then
MY_BASEDIR_VERSION=$MY_PWD # Where libexec, share and var are
ledir=$MY_BASEDIR_VERSION/libexec # Where mysqld is
@@ -156,17 +201,17 @@ if test -z "$MYSQL_HOME"
then
if test -r "$MY_BASEDIR_VERSION/my.cnf" && test -r "$DATADIR/my.cnf"
then
- echo "WARNING: Found two instances of my.cnf -"
- echo "$MY_BASEDIR_VERSION/my.cnf and"
- echo "$DATADIR/my.cnf"
- echo "IGNORING $DATADIR/my.cnf"
- echo
+ log_error "WARNING: Found two instances of my.cnf -
+$MY_BASEDIR_VERSION/my.cnf and
+$DATADIR/my.cnf
+IGNORING $DATADIR/my.cnf"
+
MYSQL_HOME=$MY_BASEDIR_VERSION
elif test -r "$DATADIR/my.cnf"
then
- echo "WARNING: Found $DATADIR/my.cnf"
- echo "Datadir is deprecated place for my.cnf, please move it to $MY_BASEDIR_VERSION"
- echo
+ log_error "WARNING: Found $DATADIR/my.cnf
+The data directory is a deprecated location for my.cnf, please move it to
+$MY_BASEDIR_VERSION/my.cnf"
MYSQL_HOME=$DATADIR
else
MYSQL_HOME=$MY_BASEDIR_VERSION
@@ -174,12 +219,6 @@ then
fi
export MYSQL_HOME
-user=@MYSQLD_USER@
-niceness=0
-
-# these rely on $DATADIR by default, so we'll set them later on
-pid_file=
-err_log=
# Get first arguments from the my.cnf file, groups [mysqld] and [mysqld_safe]
# and then merge with the command line arguments
@@ -201,16 +240,56 @@ append_arg_to_args () {
}
args=
+
SET_USER=2
parse_arguments `$print_defaults $defaults --loose-verbose mysqld server`
if test $SET_USER -eq 2
then
SET_USER=0
fi
+
parse_arguments `$print_defaults $defaults --loose-verbose mysqld_safe safe_mysqld`
parse_arguments PICK-ARGS-FROM-ARGV "$@"
-safe_mysql_unix_port=${mysql_unix_port:-${MYSQL_UNIX_PORT:-@MYSQL_UNIX_ADDR@}}
+# Determine what logging facility to use
+if [ -n "$err_log" -o $syslog -eq 0 ]
+then
+ if [ -n "$err_log" ]
+ then
+ # mysqld adds ".err" if there is no extension on the --log-err
+ # argument; must match that here, or mysqld_safe will write to a
+ # different log file than mysqld
+
+ # mysqld does not add ".err" to "--log-error=foo."; it considers a
+ # trailing "." as an extension
+ if expr "$err_log" : '.*\.[^/]*$' > /dev/null
+ then
+ :
+ else
+ err_log="$err_log".err
+ fi
+
+ case "$err_log" in
+ /* ) ;;
+ * ) err_log="$DATADIR/$err_log" ;;
+ esac
+ else
+ err_log=$DATADIR/`@HOSTNAME@`.err
+ fi
+
+ append_arg_to_args "--log-error=$err_log"
+
+ if [ $syslog -eq 1 ]
+ then
+ # User explicitly asked for syslog, so warn that it isn't used
+ log_error "Can't log to error log and syslog at the same time. Remove all
--log-error configuration options for --syslog to take effect. Logging to '$err_log'."
+ fi
+
+ # Don't use syslog since syslog and error log don't mix well
+ syslog=0
+fi
+
+safe_mysql_unix_port=${mysql_unix_port:-${MYSQL_UNIX_PORT:-@MYSQL_UNIX_ADDR@}}
# Make sure that directory for $safe_mysql_unix_port exists
mysql_unix_port_dir=`dirname $safe_mysql_unix_port`
if [ ! -d $mysql_unix_port_dir ]
@@ -228,12 +307,11 @@ fi
if test ! -x $ledir/$MYSQLD
then
- echo "The file $ledir/$MYSQLD doesn't exist or is not executable"
- echo "Please do a cd to the mysql installation directory and restart"
- echo "this script from there as follows:"
- echo "./bin/mysqld_safe".
- echo "See http://dev.mysql.com/doc/mysql/en/mysqld_safe.html for more"
- echo "information"
+ log_error "The file $ledir/$MYSQLD
+does not exist or is not executable. Please cd to the mysql installation
+directory and restart this script from there as follows:
+./bin/mysqld_safe&
+See http://dev.mysql.com/doc/mysql/en/mysqld_safe.html for more information"
exit 1
fi
@@ -248,30 +326,6 @@ else
fi
append_arg_to_args "--pid-file=$pid_file"
-if [ -n "$err_log" ]
-then
- # mysqld adds ".err" if there is no extension on the --log-err
- # argument; must match that here, or mysqld_safe will write to a
- # different log file than mysqld
-
- # mysqld does not add ".err" to "--log-error=foo."; it considers a
- # trailing "." as an extension
- if expr "$err_log" : '.*\.[^/]*$' > /dev/null
- then
- :
- else
- err_log="$err_log".err
- fi
-
- case "$err_log" in
- /* ) ;;
- * ) err_log="$DATADIR/$err_log" ;;
- esac
-else
- err_log=$DATADIR/`@HOSTNAME@`.err
-fi
-append_arg_to_args "--log-error=$err_log"
-
if test -n "$mysql_unix_port"
then
append_arg_to_args "--socket=$mysql_unix_port"
@@ -296,7 +350,7 @@ fi
if nohup nice > /dev/null 2>&1
then
normal_niceness=`nice`
- nohup_niceness=`nohup nice`
+ nohup_niceness=`nohup nice 2>/dev/null`
numeric_nice_values=1
for val in $normal_niceness $nohup_niceness
@@ -366,18 +420,17 @@ then
then
if @FIND_PROC@
then # The pid contains a mysqld process
- echo "A mysqld process already exists"
- echo "A mysqld process already exists at " `date` >> $err_log
+ log_error "A mysqld process already exists"
exit 1
fi
fi
rm -f $pid_file
if test -f $pid_file
then
- echo "Fatal error: Can't remove the pid file: $pid_file"
- echo "Fatal error: Can't remove the pid file: $pid_file at " `date` >> $err_log
- echo "Please remove it manually and start $0 again"
- echo "mysqld daemon not started"
+ log_error "Fatal error: Can't remove the pid file:
+$pid_file
+Please remove it manually and start $0 again;
+mysqld daemon not started"
exit 1
fi
fi
@@ -394,33 +447,32 @@ fi
# $MY_BASEDIR_VERSION/bin/myisamchk --silent --force --fast --medium-check
$DATADIR/*/*.MYI
# $MY_BASEDIR_VERSION/bin/isamchk --silent --force $DATADIR/*/*.ISM
-echo "Starting $MYSQLD daemon with databases from $DATADIR"
-
# 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 "`date +'%y%m%d %H:%M:%S mysqld started'`" >> $err_log
+cmd="$NOHUP_NICENESS"
+
+for i in "$ledir/$MYSQLD" "$defaults" "--basedir=$MY_BASEDIR_VERSION" \
+ "--datadir=$DATADIR" "$USER_OPTION"
+do
+ cmd="$cmd "`shell_quote_string "$i"`
+done
+cmd="$cmd $args"
+# Avoid 'nohup: ignoring input' warning
+test -n "$NOHUP_NICENESS" && cmd="$cmd < /dev/null"
+
+log_notice "Starting $MYSQLD daemon with databases from $DATADIR"
while true
do
rm -f $safe_mysql_unix_port $pid_file # Some extra safety
- cmd="$NOHUP_NICENESS"
-
- for i in "$ledir/$MYSQLD" "$defaults" "--basedir=$MY_BASEDIR_VERSION" \
- "--datadir=$DATADIR" "$USER_OPTION"
- do
- cmd="$cmd "`shell_quote_string "$i"`
- done
- cmd="$cmd $args >> "`shell_quote_string "$err_log"`" 2>&1"
- #echo "Running mysqld: [$cmd]"
- eval "$cmd"
+ eval_log_error "$cmd"
if test ! -f $pid_file # This is removed if normal shutdown
then
- echo "STOPPING server from pid file $pid_file"
break
fi
@@ -433,7 +485,7 @@ do
# kill -9 is used or the process won't react on the kill.
numofproces=`ps xaww | grep -v "grep" | grep "$ledir/$MYSQLD\>" | grep -c
"pid-file=$pid_file"`
- echo -e "\nNumber of processes running now: $numofproces" | tee -a $err_log
+ log_notice "Number of processes running now: $numofproces"
I=1
while test "$I" -le "$numofproces"
do
@@ -446,16 +498,15 @@ do
# echo "TEST $I - $T **"
if kill -9 $T
then
- echo "$MYSQLD process hanging, pid $T - killed" | tee -a $err_log
- else
+ log_error "$MYSQLD process hanging, pid $T - killed"
+ else
break
fi
I=`expr $I + 1`
done
fi
- echo "`date +'%y%m%d %H:%M:%S'` mysqld restarted" | tee -a $err_log
+ log_notice "mysqld restarted"
done
-echo "`date +'%y%m%d %H:%M:%S'` mysqld ended" | tee -a $err_log
-echo "" | tee -a $err_log
+log_notice "mysqld from pid file $pid_file ended"
| Thread |
|---|
| • bk commit into 5.1 tree (tsmith:1.2506) | tim | 5 May |