mysql服务启动脚本详解

  1 #!/bin/sh
  2 # Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB
  3 # This file is public domain and comes with NO WARRANTY of any kind
  4
  5 # MySQL daemon start/stop script.
  6
  7 # Usually this is put in /etc/init.d (at least on machines SYSV R4 based
  8 # systems) and linked to /etc/rc3.d/S99mysql and /etc/rc0.d/K01mysql.
  9 # When this is done the mysql server will be started when the machine is
 10 # started and shut down when the systems goes down.
 11
 12 # Comments to support chkconfig on RedHat Linux
 13 # chkconfig: 2345 64 36
 14 # description: A very fast and reliable SQL database engine.
 15
 16 # Comments to support LSB init script conventions
 17 ### BEGIN INIT INFO
 18 # Provides: mysql
 19 # Required-Start: $local_fs $network $remote_fs
 20 # Should-Start: ypbind nscd ldap ntpd xntpd
 21 # Required-Stop: $local_fs $network $remote_fs
 22 # Default-Start:  2 3 4 5
 23 # Default-Stop: 0 1 6
 24 # Short-Description: start and stop MySQL
 25 # Description: MySQL is a very fast and reliable SQL database engine.
 26 ### END INIT INFO
 27
 28 # If you install MySQL on some other places than /usr, then you
 29 # have to do one of the following things for this script to work:
 30 #
 31 # - Run this script from within the MySQL installation directory
 32 # - Create a /etc/my.cnf file with the following information:
 33 #   [mysqld]
 34 #   basedir=<path-to-mysql-installation-directory>
 35 # - Add the above to any other configuration file (for example ~/.my.ini)
 36 #   and copy my_print_defaults to /usr/bin
 37 # - Add the path to the mysql-installation-directory to the basedir variable
 38 #   below.
 39 #
 40 # If you want to affect other MySQL variables, you should make your changes
 41 # in the /etc/my.cnf, ~/.my.cnf or other MySQL configuration files.
 42
 43 # If you change base dir, you must also change datadir. These may get
 44 # overwritten by settings in the MySQL configuration files.
 45
 46 basedir=            #mysql的安装目录
 47 datadir=            #数据存储路径
 48
 49 # Default value, in seconds, afterwhich the script should timeout waiting
 50 # for server start.
 51 # Value here is overriden by value in my.cnf.
 52 # 0 means don‘t wait at all
 53 # Negative numbers mean to wait indefinitely
 54 service_startup_timeout=900
 55
 56 # Lock directory for RedHat / SuSE.
 57 lockdir=‘/var/lock/subsys‘                #mysql进程锁
 58 lock_file_path="$lockdir/mysql"
 59
 60 # The following variables are only set for letting mysql.server find things.
 61
 62 # Set some defaults
 63 mysqld_pid_file_path=
 64 if test -z "$basedir"                     #依次确定$basedir,$datadir,$bindir等路径
 65 then
 66   basedir=/usr
 67   bindir=/usr/bin
 68   if test -z "$datadir"
 69   then
 70     datadir=/var/lib/mysql
 71   fi
 72   sbindir=/usr/sbin
 73   libexecdir=/usr/sbin
 74 else
 75   bindir="$basedir/bin"
 76   if test -z "$datadir"
 77   then
 78     datadir="$basedir/data"
 79   fi
 80   sbindir="$basedir/sbin"
 81   libexecdir="$basedir/libexec"
 82 fi
 83
 84 # datadir_set is used to determine if datadir was set (and so should be
 85 # *not* set inside of the --basedir= handler.)
 86 datadir_set=
 87
 88 #
 89 # Use LSB init script functions for printing messages, if possible
 90 #
 91 lsb_functions="/lib/lsb/init-functions"   #linux系统脚本,包含打印log函数
 92 if test -f $lsb_functions ; then    #如果存在改文件,将这些函数导入该脚本
 93   . $lsb_functions
 94 else                              #否则使用自定义信息
 95   log_success_msg()
 96   {
 97     echo " SUCCESS! [email protected]"
 98   }
 99   log_failure_msg()
100   {
101     echo " ERROR! [email protected]"
102   }
103 fi
104
105 PATH="/sbin:/usr/sbin:/bin:/usr/bin:$basedir/bin"           #添加$basrdir到系统环境变量
106 export PATH
107
108 mode=$1    # start or Stop        #传入启动脚本的第1个参数
109
110 [ $# -ge 1 ] && shift      #如果参数个数大于等于1个,shift删掉第一个参数,将剩余参数传给$other_args
111
112
113 other_args="$*"   # uncommon, but needed when called from an RPM upgrade action
114            # Expected: "--skip-networking --skip-grant-tables"
115            # They are not checked here, intentionally, as it is the resposibility
116            # of the "spec" file author to give correct arguments only.
117
118 case `echo "testing\c"`,`echo -n testing`     #echo_c和echo_n的定义;\c不加换行符,-n不换行
119     *c*,-n*) echo_n=   echo_c=     ;;
120     *c*,*)   echo_n=-n echo_c=     ;;
121     *)       echo_n=   echo_c=‘\c‘ ;;
122 esac
123
124
125 parse_server_arguments() {                 #该函数将my_print_defaults 命令分析出得参数赋值给相应的变量
126   for arg do
127     case "$arg" in
128       --basedir=*)  basedir=`echo "$arg" | sed -e ‘s/^[^=]*=//‘`    #利用正则表达式获取
129                     bindir="$basedir/bin"
130             if test -z "$datadir_set"; then
131               datadir="$basedir/data"
132             fi
133             sbindir="$basedir/sbin"
134             libexecdir="$basedir/libexec"
135         ;;
136       --datadir=*)  datadir=`echo "$arg" | sed -e ‘s/^[^=]*=//‘`
137             datadir_set=1
138     ;;
139       --pid-file=*) mysqld_pid_file_path=`echo "$arg" | sed -e ‘s/^[^=]*=//‘` ;;
140       --service-startup-timeout=*) service_startup_timeout=`echo "$arg" | sed -e ‘s/^[^=]*=//‘` ;;
141     esac
142   done
143 }
144
145
146
147 wait_for_pid () {                        #该函数在启动和停止mysql服务时用于等待pid的生成
148   verb="$1"           # created | removed
149   pid="$2"            # process ID of the program operating on the pid-file
150   pid_file_path="$3" # path to the PID file.
151
152   i=0
153   avoid_race_condition="by checking again"
154
155   while test $i -ne $service_startup_timeout ; do    #"-ne",如果不等于
156
157     case "$verb" in                                  #处理第1个参数,created或removed
158       ‘created‘)
159         # wait for a PID-file to pop into existence.
160         test -s "$pid_file_path" && i=‘‘ && break
161         ;;
162       ‘removed‘)
163         # wait for this PID-file to disappear
164         test ! -s "$pid_file_path" && i=‘‘ && break
165         ;;
166       *)
167         echo "wait_for_pid () usage: wait_for_pid created|removed pid pid_file_path"
168         exit 1
169         ;;
170     esac
171
172     # if server isn‘t running, then pid-file will never be updated
173     if test -n "$pid"; then                 #如果pid非空
174       if kill -0 "$pid" 2>/dev/null; then   #kill -0发送一个无效信号,可检查进程是否存在,存在返回0,反之则1
175         :  # the server still runs
176       else
177         # The server may have exited between the last pid-file check and now.
178         if test -n "$avoid_race_condition"; then
179           avoid_race_condition=""
180           continue  # Check again.
181         fi
182
183         # there‘s nothing that will affect the file.
184         log_failure_msg "The server quit without updating PID file ($pid_file_path)."
185         return 1  # not waiting any more.
186       fi
187     fi
188
189     echo $echo_n ".$echo_c"
190     i=`expr $i + 1`
191     sleep 1                   #睡眠1秒
192
193   done
194
195   if test -z "$i" ; then   #如果i长度为0
196     log_success_msg
197     return 0
198   else
199     log_failure_msg
200     return 1
201   fi
202 }
203
204
205 # Get arguments from the my.cnf file,
206 # the only group, which is read from now on is [mysqld]
207 if test -x ./bin/my_print_defaults
208 then
209   print_defaults="./bin/my_print_defaults"
210 elif test -x $bindir/my_print_defaults
211 then
212   print_defaults="$bindir/my_print_defaults"
213 elif test -x $bindir/mysql_print_defaults
214 then
215   print_defaults="$bindir/mysql_print_defaults"
216 else
217   # Try to find basedir in /etc/my.cnf
218   conf=/etc/my.cnf
219   print_defaults=
220   if test -r $conf
221   then
222     subpat=‘^[^=]*basedir[^=]*=\(.*\)$‘
223     dirs=`sed -e "/$subpat/!d" -e ‘s//\1/‘ $conf`
224     for d in $dirs
225     do
226       d=`echo $d | sed -e ‘s/[     ]//g‘`
227       if test -x "$d/bin/my_print_defaults"
228       then
229         print_defaults="$d/bin/my_print_defaults"
230         break
231       fi
232       if test -x "$d/bin/mysql_print_defaults"
233       then
234         print_defaults="$d/bin/mysql_print_defaults"
235         break
236       fi
237     done
238   fi
239
240   # Hope it‘s in the PATH ... but I doubt it
241   test -z "$print_defaults" && print_defaults="my_print_defaults"
242 fi
243
244 #
245 # Read defaults file from ‘basedir‘.   If there is no defaults file there
246 # check if it‘s in the old (depricated) place (datadir) and read it from there
247 #
248
249 #配置文件的目录,先从basedir读取,不行再读取datadir的
250 extra_args=""
251 if test -r "$basedir/my.cnf"
252 then
253   extra_args="-e $basedir/my.cnf"
254 else
255   if test -r "$datadir/my.cnf"
256   then
257     extra_args="-e $datadir/my.cnf"
258   fi
259 fi
260
261 #使用parse_server_arguments函数和my_print_defaults 从my.cnf 中获取相应的参数并付给相应的变量
262 parse_server_arguments `$print_defaults $extra_args mysqld server mysql_server mysql.server`
263
264 #
265 # Set pid file if not given
266 #指定mysql启动时进程文件的位置
267 if test -z "$mysqld_pid_file_path"
268 then
269   mysqld_pid_file_path=$datadir/`hostname`.pid
270 else
271   case "$mysqld_pid_file_path" in
272     /* ) ;;
273     * )  mysqld_pid_file_path="$datadir/$mysqld_pid_file_path" ;;
274   esac
275 fi
276
277 case "$mode" in
278   ‘start‘)
279     # Start daemon
280
281     # Safeguard (relative paths, core dumps..)
282     cd $basedir
283
284     echo $echo_n "Starting MySQL"
285     if test -x $bindir/mysqld_safe  #如果文件存在且可执行
286     then
287       # Give extra arguments to mysqld with the my.cnf file. This script
288       # may be overwritten at next upgrade.
289       #关键语句,启动mysqld_safe,传入3个参数:datadir,pid-file,other_args;将输出丢弃到系统黑洞/dev/null
290       $bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &
291       wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?
292
293       # Make lock for RedHat / SuSE  mysql锁的检测和创建
294       if test -w "$lockdir"       #如果存在且可写
295       then
296         touch "$lock_file_path"
297       fi
298
299       exit $return_value
300     else
301       log_failure_msg "Couldn‘t find MySQL server ($bindir/mysqld_safe)"
302     fi
303     ;;
304
305   ‘stop‘)
306     # Stop daemon. We use a signal here to avoid having to know the
307     # root password.
308
309     if test -s "$mysqld_pid_file_path"    #如果存在且至少有一个字符
310     then
311       mysqld_pid=`cat "$mysqld_pid_file_path"`
312
313       if (kill -0 $mysqld_pid 2>/dev/null)
314       then
315         echo $echo_n "Shutting down MySQL"
316         kill $mysqld_pid
317         # mysqld should remove the pid file when it exits, so wait for it.
318         wait_for_pid removed "$mysqld_pid" "$mysqld_pid_file_path"; return_value=$?
319       else
320         log_failure_msg "MySQL server process #$mysqld_pid is not running!"
321         rm "$mysqld_pid_file_path"
322       fi
323
324       # Delete lock for RedHat / SuSE
325       if test -f "$lock_file_path"    #如果存在且为普通文件
326       then
327         rm -f "$lock_file_path"
328       fi
329       exit $return_value
330     else
331       log_failure_msg "MySQL server PID file could not be found!"
332     fi
333     ;;
334
335   ‘restart‘)
336     # Stop the service and regardless of whether it was
337     # running or not, start it again.
338     if $0 stop  $other_args; then
339       $0 start $other_args
340     else
341       log_failure_msg "Failed to stop running server, so refusing to try to start."
342       exit 1
343     fi
344     ;;
345
346   ‘reload‘|‘force-reload‘)
347     if test -s "$mysqld_pid_file_path" ; then
348       read mysqld_pid <  "$mysqld_pid_file_path"
349       kill -HUP $mysqld_pid && log_success_msg "Reloading service MySQL"
350       touch "$mysqld_pid_file_path"
351     else
352       log_failure_msg "MySQL PID file could not be found!"
353       exit 1
354     fi
355     ;;
356   ‘status‘)
357     # First, check to see if pid file exists
358     if test -s "$mysqld_pid_file_path" ; then
359       read mysqld_pid < "$mysqld_pid_file_path"
360       if kill -0 $mysqld_pid 2>/dev/null ; then
361         log_success_msg "MySQL running ($mysqld_pid)"
362         exit 0
363       else
364         log_failure_msg "MySQL is not running, but PID file exists"
365         exit 1
366       fi
367     else
368       # Try to find appropriate mysqld process
369       mysqld_pid=`pidof $libexecdir/mysqld`
370
371       # test if multiple pids exist
372       pid_count=`echo $mysqld_pid | wc -w`
373       if test $pid_count -gt 1 ; then
374         log_failure_msg "Multiple MySQL running but PID file could not be found ($mysqld_pid)"
375         exit 5
376       elif test -z $mysqld_pid ; then
377         if test -f "$lock_file_path" ; then
378           log_failure_msg "MySQL is not running, but lock file ($lock_file_path) exists"
379           exit 2
380         fi
381         log_failure_msg "MySQL is not running"
382         exit 3
383       else
384         log_failure_msg "MySQL is running but PID file could not be found"
385         exit 4
386       fi
387     fi
388     ;;
389     *)
390       # usage
391       basename=`basename "$0"`
392       echo "Usage: $basename  {start|stop|restart|reload|force-reload|status}  [ MySQL server options ]"
393       exit 1
394     ;;
395 esac
396
397 exit 0
时间: 2024-10-07 02:24:25

mysql服务启动脚本详解的相关文章

[shell脚本] mysql服务启动脚本

服务启动脚本(初始化.启动.登录) #!/bin/bash export PID=/usr/local/nestdb_master/bin/mysqld export PASSWORD=123456 function status() { ps -ef | grep -v 'grep'|grep ${PID} >/dev/null if [ $? -eq 0 ]; then echo "running" return 0 else echo "not running&q

mysql启动脚本详解

1 #!/bin/sh 2 # Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB 3 # This file is public domain and comes with NO WARRANTY of any kind 4 5 # MySQL daemon start/stop script. 6 7 # Usually this is put in /etc/init.d (at lea

MySQL服务启动脚本

#!/bin/sh# chkconfig: 2345 21 60# description: Start mysql and stop mysql scripts.#filename:mydb_start.sh#date:2015-12-13#作者:linuxzkq#version:v1.0 pidfile="/application/data/mysql/test-D.pid"mysql_path="/application/mysql"datadir="

Linux开机启动程序详解

我们假设大家已经熟悉其它操作系统的引导过程,了解硬件的自检引导步骤,就只从Linux操作系统的引导加载程序(对个人电脑而言通常是LILO)开始,介绍Linux开机引导的步骤. 加载内核LILO启动之后,如果你选择了Linux作为准备引导的操作系统,第一个被加载的东西就是内核.请记住此时的计算机内存中还不存在任何操作系统,PC(因为它们天然的设计缺陷)也还没有办法存取机器上全部的内存.因此,内核就必须完整地加载到可用RAM的第一个兆字节之内.为了实现这个目的,内核是被压缩了的.这个文件的头部包含着

Linux如何实现开机启动程序详解

Linux开机启动程序详解我们假设大家已经熟悉其它操作系统的引导过程,了解硬件的自检引导步骤,就只从Linux操作系统的引导加载程序(对个人电脑而言通常是LILO)开始,介绍Linux开机引导的步骤. 加载内核LILO启动之后,如果你选择了Linux作为准备引导的操作系统,第一个被加载的东西就是内核.请记住此时的计算机内存中还不存在任何操作系统,PC(因为它们天然的设计缺陷)也还没有办法存取机器上全部的内存.因此,内核就必须完整地加载到可用RAM的第一个兆字节之内.为了实现这个目的,内核是被压缩

Linux如何实现开机启动程序详解(转)

Linux开机启动程序详解我们假设大家已经熟悉其它操作系统的引导过程,了解硬件的自检引导步骤,就只从Linux操作系统的引导加载程序(对个人电脑而言通常是LILO)开始,介绍Linux开机引导的步骤. 加载内核LILO启动之后,如果你选择了Linux作为准备引导的操作系统,第一个被加载的东西就是内核.请记住此时的计算机内存中还不存在任何操作系统,PC(因为它们天然的设计缺陷)也还没有办法存取机器上全部的内存.因此,内核就必须完整地加载到可用RAM的第一个兆字节之内.为了实现这个目的,内核是被压缩

FLASH动作脚本详解

FLASH动作脚本详解 一.FLASH脚本基础入门讲解 二.按钮AS的编写 三.影片剪辑的AS编写 四.动态文本框 五.影片剪辑的拖拽 六.流程控制与循环语句 七.绘图及颜色的AS的编写 八.声音 AS 的编写与控制 九.时间日期的 AS编写 十.点语法以及路径 十一.深入了解时间控制 十二.无条件转移 十三.变量 十四.运算符(一) 十五.变量(二) 十六.影片剪辑的属性 十七.再讲循环语句 十八.影片剪辑处理函数 十九.复制影片剪辑 二十.深入 startDrag()与 stopDrag()

Linux(RHEL6)启动过程详解

Linux(红帽RHEL6)启动过程详解: RHEL的一个重要和强大的方面是它是开源的,并且系统的启动过程是用户可配置的.用户可以自由的配置启动过程的许多方面,包括可以指定启动时运行的程序.同样的,系统关机时所要终止的进程也是可以进行组织和配置的,即使这个过程的自定义很少被需要. 理解系统的启动和关机过程是如何实现的不仅可以允许自定义,而且也可以更容易的处理与系统的启动或者关机相关的故障.  1.启动过程  以下是启动过程的几个基本阶段:   ① 系统加载并允许boot loader.此过程的细

Linux启动流程详解【转载】

在BIOS阶段,计算机的行为基本上被写死了,可以做的事情并不多:一般就是通电.BIOS.主引导记录.操作系统这四步.所以我们一般认为加载内核是linux启动流程的第一步. 第一步.加载内核 操作系统接管硬件以后,首先读入 /boot 目录下的内核文件. 我们查看一下,/boot 目录下面大概是这样一些文件: 第二步.启动初始化进程 内核文件加载以后,就开始运行第一个程序 /sbin/init,它的作用是初始化系统环境. 由于init是第一个运行的程序,它的进程编号(pid)就是1.其他所有进程都