diff options
author | unknown <tsmith@siva.hindu.god> | 2007-05-04 19:06:36 -0600 |
---|---|---|
committer | unknown <tsmith@siva.hindu.god> | 2007-05-04 19:06:36 -0600 |
commit | aca2b28e7e41aede709300fc266371e50745403a (patch) | |
tree | 3d7b01e98b264871d29f261479768f5e205e08f4 /scripts | |
parent | 1fe6d1511a310a91da93958cee046b37a8a09f4a (diff) | |
download | mariadb-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.sh | 255 |
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" |