一、Linux啟動腳本原理
1、init和運作級别
以CentOS為例,init有7個運作級别(run level),打開/etc/inittab檔案能看到:
# Default runlevel. The runlevels used by RHS are:
# 0 – halt (Do NOT set initdefault to this)
# 1 – Sing user mode
# 2 – Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 – Full multiuser mode
# 4 – unused
# 5 – X11
# 6 – reboot (Do NOT set initdefault to this)
/etc/inittab檔案規定了系統進入到每一個運作級别時需要運作的指令,也規定了系統預設運作級别:
id:3:initdefault:
在機器引導時,系統進入預設運作級别,并執行相應級别所需指令。
2、服務啟動腳本
/etc/init.d中存放了所有的啟動腳本,我們可以通過如下指令來啟動某個服務:
#/etc/init.d/iptables start
或者
#service iptables start
以此來啟動iptables服務。
雖然/etc/init.d目錄中存放了所有啟動腳本,但是系統引導時,init并不直接在/etc/init.d目錄中查找各個服務的啟動腳本,而是在/etc/rc.d目錄中查找,該目錄中包含了代表不同的init啟動級别的子目錄即rcx.d目錄:
rcx.d目錄中存放都是/etc/rc.d/init.d目錄中腳本的符号連結,以rc3.d為例:
這些符号連結都以S或K開頭,随後跟一個數字以及腳本所控制的服務名稱,如K05rabbitmq-server,當init從低運作級别向高運作級别切換時,其按照數字遞增的順序運作所有以S開頭的腳本,S=start,即啟動腳本所控制的服務,按照數字遞減的順序殺死以K開頭的腳本,K=kill,即殺死腳本所控制的服務。
腳本啟動或者殺死的順序由數字來控制,當然,我們也可以改變這些:
#ln –s /etc/init.d/rabbitmq-server
S70rabbitmq-server
#ln –s /etc/init.d/rabbitmq-server K70rabbitmq-server
二、Redis啟動腳本
有了上面那些理論支撐,接下來就親自操刀編寫一個Redis啟動腳本。
1、建立啟動腳本
假設服務名稱為redis-server,可執行檔案路徑為/usr/local/bin,配置檔案為redis.conf,配置檔案路徑為/etc,程序ID存放檔案為redis.pid,程序ID存放檔案路徑為/var/run,腳本檔案為redisd,腳本檔案存放路徑為/etc/init.d,服務描述為redis daemon,當然這些資訊可以根據自己需要定制,具體腳本如下:
#!/bin/sh
#chkconfig: 345 86 14
#description: Startup and shutdown script
for Redis
PROGDIR=/usr/local/bin
PROGNAME=redis-server
DAEMON=$PROGDIR/$PROGNAME
CONFIG=/etc/redis.conf
PIDFILE=/var/run/redis.pid
DESC="redis daemon"
SCRIPTNAME=/etc/init.d/redisd
start()
{
if
test -x $DAEMON
then
echo -e "Starting $DESC: $PROGNAME"
if
$DAEMON $CONFIG
then
echo
-e "OK"
else
-e "failed"
fi
else
echo
-e "Couldn't find Redis Server ($DAEMON)"
fi
}
stop()
test -e $PIDFILE
-e "Stopping $DESC: $PROGNAME"
kill `cat $PIDFILE`
-e "No Redis Server ($DAEMON) running"
restart()
echo -e "Restarting $DESC: $PROGNAME"
stop
start
list()
ps
aux | grep $PROGNAME
case $1 in
start)
start
;;
stop)
restart)
restart
list)
list
*)
echo "Usage: $SCRIPTNAME {start|stop|restart|list}" >&2
exit 1
esac
exit 0
2、增加服務并開機啟動
cp ./redisd /etc/rc.d/init.d/redisd
chmod +x /etc/rc.d/init.d/redisd
chkconfig --add redisd
chkconfig --level 345 redisd on
chkconfig --list redisd
執行該腳本後,就可以開始start|stop|restart|list你的服務了。