SHELL 脚本如何显示 OK 或 FAILED

2018/03/23 Shell

前言

在日常的工作中运维通常会安装各种各样的应用服务,例如:Nginx、httpd、MySQL 等。如果我们是用 yum 来安装,通常情况下 RPM 包的作者已经帮助我们写好了服务的启动脚本。我们在使用启动脚本的过程中几乎都会看到以下提示信息,提示我们服务是否启动成功。

上图所看到的样式,在 CentOS7.X 版本的操作系统中可能不会经常看到,因为 CentOS7 已经改为 systemd 格式的启动脚本。

问题来了,上图显示的 OK 和 FAILED 是如何出现的呢?我们自己写脚本的时候能不能也能有这样的效果?答案肯定是可以,在这之前我们要先说一下 /etc/init.d/functions 函数。

/etc/init.d/functions

functions 这个脚本是给 /etc/init.d 里边的文件使用的,提供了一些基础的功能,看看里边究竟有些什么。首先会设置 umask,path,还有语言环境,然后会设置 success,failure,warning,normal 几种情况下的字体颜色。

checkpid:检查是否已存在pid,如果有一个存在,返回0(通过查看/proc目录)
daemon:启动某个服务。/etc/init.d目录部分脚本的start使用到这个
killproc:杀死某个进程。/etc/init.d目录部分脚本的stop使用到这个
pidfileofproc:寻找某个进程的pid
pidofproc:类似上面的,只是还查找了pidof命令
status:返回一个服务的状态
echo_success,echo_failure,echo_passed,echo_warning分别输出各类信息
success,failure,passed,warning分别记录日志并调用相应的方法
action:打印某个信息并执行给定的命令,它会根据命令执行的结果来调用 success,failure方法
strstr:判断$1是否含有$2
confirm:显示 "Start service $1 (Y)es/(N)o/(C)ontinue? [Y]"的提示信息,并返回选择结果

其实 RPM 包中的启动脚本就是调用了 functions 函数中的 success 和 failure 方法,你也可能说有的脚本里并没有调用这两个函数,其实还有另一个函数 action() 我们打开 functions 文件找到 action()函数看看里面写了什么。

# Run some action. Log its output.
action() {
  local STRING rc

  STRING=$1
  echo -n "$STRING "
  shift
  "$@" && success $"$STRING" || failure $"$STRING"
  rc=$?
  echo
  return $rc
}

action函数中可以看到本质上函数内部还是调用了 success 和 failure 两个函数。

下面我们通过一个示例演示一下如何使用 success 和 failure 函数实现我们期望的效果:

在 /tmp 下创建名为 nginx 的文件

#!/bin/bash
#
# 演示 success 和 failure 函数效果
. /etc/init.d/functions

nginx="/sbin/nginx"

show_usage() {
    usage="Usage: `basename $0` [start|stop]"
    echo $usage
    exit
}

########################
# start 函数
# 调用 functions 中的 success 和 failure
########################
start() {
    [[ `netstat -ntlup|grep nginx|wc -l` > 0 ]] && failure && echo "Nginx is Running!" && exit
    $nginx
    ([ $? -eq 0 ] && success && echo "Nginx starts successfully!") || (failure && echo "Failed start nginx") 
    
}

########################
# stop 函数
# 调用 functions 中的 success 和 failure
########################
stop() {
    [[ `netstat -ntlup|grep nginx|wc -l` == 0 ]] && failure && echo "Nginx is NOT running!" && exit
    echo "Stopping Nginx..."  
    $nginx -s stop  
    ([ $? -eq 0 ] && success && echo "Nginx stops successfully!") || (failure && echo "Failed stop nginx!")  
}

case $1 in
  start)
      start
      ;;
  stop)
      stop
      ;;
  *)
      show_usage
      ;;
esac 

记得为脚本添加执行权限,接下来我们执行该脚本看看效果如何。

脚本效果演示

上图可以发现,脚本在第一次启动 Nginx 时显示 OK 连续在启动一次因为 Nginx 已经运行了,所以显示 FAILED,停止时也是相同道理。

Search

    Table of Contents