List:Commits« Previous MessageNext Message »
From:tim Date:May 5 2007 3:06am
Subject:bk commit into 5.1 tree (tsmith:1.2506)
View as plain text  
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)tim5 May