设为首页 加入收藏

TOP

如何写SysV服务管理脚本(三)
2017-10-13 10:36:37 】 浏览:5866
Tags:如何 SysV 服务 管理 脚本
# not running; per LSB standards this is "ok" action $"Stopping $prog: " /bin/true # pid文件都不存在,直接显示成功 return 0 fi MYSQLPID=`cat "$mypidfile" 2>/dev/null` # 读取pidfile中的pid号 if [ -n "$MYSQLPID" ]; then # 如果pid不为空,则 /bin/kill "$MYSQLPID" >/dev/null 2>&1 # 先发送默认的TERM信号杀一次 ret=$? if [ $ret -eq 0 ]; then # 如果杀成功了,则执行下面一段。 # 否则直接失败,但这不可能。为了逻辑完整,后面仍写了else TIMEOUT="$STOPTIMEOUT" while [ $TIMEOUT -gt 0 ]; do # 在延迟时间内,每隔1秒杀一次 /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 # 否则进程杀死成功,删除pidfile和lockfile rm -f $lockfile rm -f "$socketfile" action $"Stopping $prog: " /bin/true fi else action $"Stopping $prog: " /bin/false fi else # 如果pid为空,则表示未成功读取pidfile。 # failed to read pidfile, probably insufficient permissions action $"Stopping $prog: " /bin/false ret=4 fi return $ret }

虽然有点长,但有了前面SysV脚本要具备的能力的概念,stop函数的逻辑都一样好简单。

1.5 reload函数分析

关于reload函数,主要有两点:(1).语法检查;(2).发送HUP信号给"master"进程。其中语法检查要程序自身能支持,例如httpd -tnginx -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

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

转载请注明出处:http://www.cnblogs.com/f-ck-need-u/p/7524401.html

注:若您觉得这篇文章还不错请点击下右下角的推荐,有了您的支持才能激发作者更大的写作热情,非常感谢!