summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorunknown <tsmith@siva.hindu.god>2007-05-04 19:06:36 -0600
committerunknown <tsmith@siva.hindu.god>2007-05-04 19:06:36 -0600
commitaca2b28e7e41aede709300fc266371e50745403a (patch)
tree3d7b01e98b264871d29f261479768f5e205e08f4 /scripts
parent1fe6d1511a310a91da93958cee046b37a8a09f4a (diff)
downloadmariadb-git-aca2b28e7e41aede709300fc266371e50745403a.tar.gz
Bug #4858: mysql_safe logs to syslog instead of stderr
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: 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.
Diffstat (limited to 'scripts')
-rw-r--r--scripts/mysqld_safe.sh255
1 files changed, 153 insertions, 102 deletions
diff --git a/scripts/mysqld_safe.sh b/scripts/mysqld_safe.sh
index bfaa1d57ed2..357dd275d1f 100644
--- a/scripts/mysqld_safe.sh
+++ b/scripts/mysqld_safe.sh
@@ -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"