LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 198|回复: 0

reload函数分析

[复制链接]
发表于 2023-12-20 14:49:17 | 显示全部楼层 |阅读模式

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”也是一样的行为。


您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表