引言
上一节中,我们手工编译了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 () {

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

被折叠的 条评论
为什么被折叠?



