MySQL service啟動指令碼淺析(r12筆記第59天)
我們在搭建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/mysql
wait_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
fi
status的部分更簡單,就是讀取pid檔案中的程序號資訊。
不要小看這個指令碼,裡面涉及不少邏輯校驗,也可以在這個基礎上根據自己的需求來做一些改變。至少在這一點上,這個指令碼是可以根據我們的需求來定製的。