reload函数分析
关于reload函数,主要有两点:(1).语法检查;(2).发送HUP信号给”master”进程。其中语法检查要程序自身能支持,例如httpd -t,nginx -t。
以下是/etc/init.d/{httpd,nginx}两个脚本中的reload函数。
## reload() in /etc/rc.d/init.d/httpd
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
# Force LSB behaviour from killproc # 语法检查通过,发送HUP信号
LSB=1 killproc -p ${pidfile} $httpd -HUP
RETVAL=$?
if [ $RETVAL -eq 7 ]; then # 注意reload失败时退出状态码为7
failure $"httpd shutdown"
fi
fi
echo
}
## reload() in /etc/rc.d/init.d/nginx
reload() {
configtest_q || return 6 # 语法检查
echo -n $"Reloading $prog: "
killproc -p $pidfile $prog -HUP # 发送HUP信号
echo
}
configtest_q() {
$nginx -t -q -c $NGINX_CONF_FILE
}
case "$1" in
reload)
rh_status_q || exit 7 # reload失败时,退出状态码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
status、restart、force-reload等
status:就是为了获取进程状态的,一般直接调用functions中的status函数status -p "$pidfile" $prog。
restart:一般直接stop再start即可。
force-reload:其实就是restart。
condrestart:称为条件式重启。所谓的条件一般是判断锁文件是否存在,存在则重启,否则忽略该动作。”try-restart”也是一样的行为。
|