MySQL系列(2):mysqld_safe解析

本文详细剖析了MySQL启动脚本mysqld_safe的工作原理,包括如何设置参数、生成和执行命令,以及异常处理机制。通过学习其写法,可以掌握如何编写一个可靠的守护进程启动脚本。

引言

上一节中,我们手工编译了mysql5.7.28。这一节就从启动脚本mysqld_safe入手,继续介绍MySQL。用mysqld_safe相比直接运行mysqld启动,有如下好处:

  • 命令更简单。我们可以直接运行mysqld_safe,它会帮我们拼接basedir/datadir/plugin-dir/user/log-error/pid-file等参数去启动mysqld。
  • 运行更可靠。它会监视mysqld,有重启机制,mysqld进程异常退出时也会清理pid/socket/shutdown文件。

温馨提示:前方代码较多,若耐心不足可直接跳到最后的总结和关键词!

分析

忽略信号

trap '' 1 2 3 15
trap '' 13

忽略信号SIGHUP/SIGINT/SIGQUIT/SIGTERM/SIGPIPE。此时按Ctrl+C或者kill $PID,不会被退出。但是可以用kill -9 $PID杀掉进程。

设置参数

defaults=
case "$1" in
    --no-defaults|--defaults-file=*|--defaults-extra-file=*)
      defaults="$1"; shift
      ;;
esac

如果第一个参数为–no-defaults或–defaults-file或–defaults-extra-file,赋给defaults并将参数左移。

find_basedir_from_cmdline "$@"

# --basedir is already overridden on command line
if test -n "$MY_BASEDIR_VERSION" -a -d "$MY_BASEDIR_VERSION" ; then
  # Search for mysqld and set ledir
  for dir in bin libexec sbin bin ; do
    if test -x "$MY_BASEDIR_VERSION/$dir/mysqld" ; then
      ledir="$MY_BASEDIR_VERSION/$dir"
      break
    fi
  done

else
  # Basedir should be parent dir of bindir, unless some non-standard
  # layout is used

  cd "`dirname $0`"
  if [ -h "$0" ] ; then
    realpath="`ls -l  "$0" | awk '{print $NF}'`"
    cd "`dirname "$realpath"`"
  fi
  cd ..
  MY_PWD="`pwd`"

  # Search for mysqld and set ledir and BASEDIR
  for dir in bin libexec sbin bin ; do
    if test -x "$MY_PWD/$dir/mysqld" ; then
      MY_BASEDIR_VERSION="$MY_PWD"
      ledir="$MY_BASEDIR_VERSION/$dir"
      break
    fi
  done

  # If we still didn't find anything, use the compiled-in defaults
  if test -z "$MY_BASEDIR_VERSION" ; then
    MY_BASEDIR_VERSION='/usr/local/mysql'
    ledir='/usr/local/mysql/bin'
  fi
fi
find_basedir_from_cmdline () {
   
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值