action $"Stopping $prog: " /bin/true
return 0
fi
MYSQLPID=`cat "$mypidfile" 2>/dev/null`
if [ -n "$MYSQLPID" ]; then
/bin/kill "$MYSQLPID" >/dev/null 2>&1
ret=$?
if [ $ret -eq 0 ]; then
TIMEOUT="$STOPTIMEOUT"
while [ $TIMEOUT -gt 0 ]; do
/bin/kill -0 "$MYSQLPID" >/dev/null 2>&1 || break
sleep 1
let TIMEOUT=${TIMEOUT}-1
done
if [ $TIMEOUT -eq 0 ]; then
echo "Timeout error occurred trying to stop MySQL Daemon."
ret=1
action $"Stopping $prog: " /bin/false
else
rm -f $lockfile
rm -f "$socketfile"
action $"Stopping $prog: " /bin/true
fi
else
action $"Stopping $prog: " /bin/false
fi
else
action $"Stopping $prog: " /bin/false
ret=4
fi
return $ret
}
虽然有点长,但有了前面SysV脚本要具备的能力的概念,stop函数的逻辑都一样好简单。
1.5 reload函数分析
关于reload函数,主要有两点:(1).语法检查;(2).发送HUP信号给"master"进程。其中语法检查要程序自身能支持,例如httpd -t
,nginx -t
。
以下是/etc/init.d/{httpd,nginx}两个脚本中的reload函数。
reload() {
echo -n $"Reloading $prog: "
if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then
RETVAL=6
echo $"not reloading due to configuration syntax error"
failure $"not reloading $httpd due to configuration syntax error"
else
LSB=1 killproc -p ${pidfile} $httpd -HUP
RETVAL=$?
if [ $RETVAL -eq 7 ]; then
failure $"httpd shutdown"
fi
fi
echo
}
reload() {
configtest_q || return 6
echo -n $"Reloading $prog: "
killproc -p $pidfile $prog -HUP
echo
}
configtest_q() {
$nginx -t -q -c $NGINX_CONF_FILE
}
case "$1" in
reload)
rh_status_q || exit 7
$1
;;
唯一需要注意的是,reload失败时,退出状态码为7。这大概已经约定俗成了吧。
再看/etc/init.d/sshd中的reload。
reload()
{
echo -n $"Reloading $prog: "
killproc -p $PID_FILE $SSHD -HUP
RETVAL=$?
echo
}
case "$1" in
reload)
rh_status_q || exit 7
reload
;;
有意思的是mysqld的reload。它直接退出不做任何动作。
case "$1" in
reload)
exit 3
;;
如果不使用killproc函数,而是使用kill命令,那么应该找出"master" pid。可以使用functions中的pidofproc函数。例如:
pid=$(pidofprco -p pidfile $processname)
action "Reloading $prog: " kill -HUP $pid
1.6 status、restart、force-reload等
- status:就是为了获取进程状态的,一般直接调用functions中的status函数
status -p "$pidfile" $prog
。
- restart:一般直接stop再start即可。
- force-reload:其实就是restart。
- condrestart:称为条件式重启。所谓的条件一般是判断锁文件是否存在,存在则重启,否则忽略该动作。"try-restart"也是一样的行为。
1.7 结束语
其实SysV服务启动脚本大多都很简单,至少它们的逻辑几乎都一样。在了解了functions中的几个函数后,再把脚本的各参数(如start、stop)应该要具备的能力搞搞清楚,这类脚本完全是小菜一两碟。
回到系列文章大纲:http://www.cnblogs.com/f-ck-need-u/p/7048359.html
注:若您觉得这篇文章还不错请点击下右下角的推荐,有了您的支持才能激发作者更大的写作热情,非常感谢!