MySQL service啟動指令碼淺析(r12筆記第59天)

jeanron100發表於2017-05-09

我們在搭建MySQL環境的時候,一般都會按照建議的標準規範來做,比如複製mysql.server到自啟動目錄下。

cp -rf $basedir/support-files/mysql.server /etc/init.d/mysql

然後設定MySQL自啟動的服務,配置完成之後就可以執行命令service mysql.server start 來啟動MySQL了。

/sbin/chkconfig --add mysql
/sbin/chkconfig --level 2345 mysql on

    當然這個是自動擋的操作,我們也可以手動檔完成。我們來看看這個神奇的指令碼在做些什麼。指令碼的內容較長,我就列出一部分內容來。

首先這個檔案的名字沒有直接的影響了,我們可以用mysql mysql.server等等,在這個目錄下注冊都可以正常識別。

# service mysql status
 SUCCESS! MySQL (Percona Server) running (15924)在/etc/inid.d這個目錄下,這個mysql命名的指令碼檔案其實也不大,大概10K的內容,不到400行的指令碼量。   # ll mysql
-rwxr-xr-x 1 root root 11056 Aug 28  2013 mysql我們取出重點的部分來解析。

首先這個指令碼支援start,stop,restart,reload(或者是force-reload),status這個幾個選項。


start的部分核心部分即為:

# may be overwritten at next upgrade.
      $bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &
      wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?

   其實這個選項很容易理解了,就是mysqld_safe來啟動,需要制定幾個啟動引數,有些引數雖然為空,但是會從/etc/my.cnf中獲取,也可以支援額外的擴充套件引數。

  我們修改下指令碼,把這幾個引數值手工列印出來。

分別是$bindir  $datadir  $mysqld_pid_file_path $other_args

# service mysql  start
Starting MySQL (Percona Server)
/usr//bin
/U01/mysql
/U01/mysql/mysql.pid


...... SUCCESS!datadir會有一系列校驗,但是也會以/etc/my.cnf的優先

# cat /etc/my.cnf|grep datadir
datadir = /U01/mysql

另外basedir也是類似,你看my.cnf裡設定的如果不夠規範,也在應用的時候就是/usr//bin了。

# cat /etc/my.cnf|grep basedir
basedir = /usr/

接下來mysqld_safe的指令碼下面會有較多的校驗。

wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?啟動的過程中,會在/var/lock/subsys下生成一個鎖定檔案,就是一個程式號的標記。    
# ll /var/lock/subsys/mysql
-rw-r--r-- 1 root root 0 May  9 23:03 /var/lock/subsys/mysqlwait_for_pid這個函式會呼叫created(start模式),removed(stop模式)來處理pid檔案。


 而stop模式的實現相對更直接一些,它是使用kill -0的方式來檢測程式是否存在,如果存在則使用kill的命令來殺掉mysqld程式。

 if test -s "$mysqld_pid_file_path"
    then
      mysqld_pid=`cat "$mysqld_pid_file_path"`
      if (kill -0 $mysqld_pid 2>/dev/null)
      then
        echo $echo_n "Shutting down MySQL (Percona Server)"
        kill $mysqld_pid
        # mysqld should remove the pid file when it exits, so wait for it.
        wait_for_pid removed "$mysqld_pid" "$mysqld_pid_file_path"; return_value=$?
      else
        log_failure_msg "MySQL (Percona Server) server process #$mysqld_pid is not running!"
        rm "$mysqld_pid_file_path"
      fi這個過程中,後臺日誌會逐步輸出,然後釋放鎖定檔案。


reload的過程使用的相對和緩,使用了kill -HUP的選項,如果想要更改配置而不需停止並重新啟動服務,可以使用這個選項。

'reload'|'force-reload')
    if test -s "$mysqld_pid_file_path" ; then
      read mysqld_pid <  "$mysqld_pid_file_path"
      kill -HUP $mysqld_pid && log_success_msg "Reloading service MySQL (Percona Server)"
      touch "$mysqld_pid_file_path"
    else
      log_failure_msg "MySQL (Percona Server) PID file could not be found!"
      exit 1
    fi

 restart的部分就是間接呼叫stop和start選項。

'restart')
    # Stop the service and regardless of whether it was
    # running or not, start it again.
    if $0 stop  $other_args; then
      $0 start $other_args
    else
      log_failure_msg "Failed to stop running server, so refusing to try to start."
      exit 1
    fistatus的部分更簡單,就是讀取pid檔案中的程式號資訊。

 不要小看這個指令碼,裡面涉及不少邏輯校驗,也可以在這個基礎上根據自己的需求來做一些改變。至少在這一點上,這個指令碼是可以根據我們的需求來定製的。





來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2138795/,如需轉載,請註明出處,否則將追究法律責任。

相關文章