1.case简介

1. Case基本介绍

1.什么是case

  1. case if 多分⽀条件判断 语句差不多,或者说 是⼀样的,只不过case要⽐ if 要更加的规范,更加的⽅便。> 2.case使⽤场景
  2. case需要实现定义好规则,然后根据⽤户传⼊ 的参数,进⾏匹配,加载不同的匹配规则内容。⽐如: nginx启停脚本。 启动 | 停⽌ | 重启 等等操作 > 写好 启动、停⽌、重启等三个预案,然后根据⽤户的 选择匹配对应的预案进⾏执⾏即可。> 3.case的执⾏流程
  3. 进⾏挨个匹配,匹配成功则直接执⾏,后续的预案就不在进⾏匹配了 。如果所有的都没有匹配成功,那么⾃动进⾏⼀个 接收所有的预案中。 *)


4.case基础语法> bash case $1 in # 可以是 $1 也可以是变量 start) command ;; stop) command ;; restart) command ;; *) echo " Useage: $0 [start | stop | restart | ] " esac

2.演示⼀个例⼦,来对⽐⼀下 if 和 case
[root@web01 shell-case]# cat if-1.sh

#!/bin/bash
cat <<eof
****************
** 1. backup **
** 2. copy **
** 3. quit **
****************
eof
read -p "请输⼊你想执⾏的操作: " OP
if [ $OP -eq 1 ];then
echo "Backup Is Done..."
elif [ $OP -eq 2 ];then
echo "Copy Is Done...."
elif [ $OP -eq 3 ];then
exit
fi

[root@web01 shell-case]# cat case-2.sh #使⽤case实现nginx服务启停脚本。

#!/bin/bash
cat <<eof
****************
** 1. backup **
** 2. copy **
** 3. quit **
eof
read -p "请输⼊你想执⾏的操作: "  OP
case $OP in
1|backup|b|back)
echo "Backup Is Done..."
;;
2)
echo "Copy IS Done...."
;;
3)
exit
;;
*)
echo "USAGE: sh $0 [ 1 | 2 | 3 ]"
exit
esac
---->有框架,写思路:
1.预案
   启动
2.是否已经启动过了,
  如果启动过了则提示已经启动成功。
    如果没有启动,则启动服务即可。
    停⽌
3.判断nginx是否是已启动状态。
    如果是启动,那我们可以尝试 nginx -s stop 停⽌
    如果没有启动,那么则提示 nginx服务未启动。
    重启
4.先停⽌,后启动。
    systemctl

通过进程⽅式来实现启停 ( nginx 、 rsync )
[root@web01 shell-case]# cat case-3.sh

#!/bin/bash
. /etc/init.d/functions

# start | stop | restart |case $1 in
start)
#1.判断是否已启动过
ngx_status=$(systemctl status nginx | grep Active | awk '{print$2}')
#2.进⾏字符串的⽐较(不是整数⽐较、也不是正则⽐较、也不是⽂件⽐较)
if [ "$ngx_status" == "inactive" ];then
systemctl start nginx
action "Nginx启动成功..." /bin/true
elif [ "$ngx_status" == "active" ];then
action "Nginx启动成功..." /bin/true
exit
fi
;;

stop)
ngx_status=$(systemctl status nginx | grep Active | awk
'{print $2}')
if [ "$ngx_status" == "inactive" ];then
action "Nginx停⽌成功..." /bin/true
elif [ "$ngx_status" == "active" ];then
systemctl stop nginx
action "Nginx停⽌成功..." /bin/true
fi
;;

*)
echo "USAGE: sh $0 [ start | stop | restart ] "
esac

#### nginx没有启停的脚本⽅式:
启动: nginx
停⽌: nginx -s stop
重启:
nginx -s stop
nginx

[root@web01 shell-case]# cat case-4.sh

#!/bin/bash
#使用case实现nginx服务启停脚本。
. /etc/init.d/functions

ngx_pid_file="/var/run/nginx.pid"

case $1 in
    start)
        # 判断是否启动
        if [ -f ${ngx_pid_file} ];then
            action "nginx已启动....无需重复启动" /bin/false
        else
            # 启动Nginx,然后判断
            /usr/sbin/nginx
            sleep 1
            if [ $? -eq 0 ];then
                action "Nginx 启动成功" /bin/true
            else
                action  "Nginx 启动失败" /bin/false
            fi
        fi
        ;;
    stop)
        if [ -f ${ngx_pid_file} ];then
            /usr/sbin/nginx -s stop
            sleep 1
            if [ $? -eq 0 ];then
                action "Nginx 关闭成功" /bin/true
            else
                action  "Nginx 关闭失败" /bin/false
            fi
        fi
        ;;
    *)
        echo "USAGE: $0 { start | stop }"
        exit
esac

curl 命令判断

2.使⽤case实现nginx状态监控脚本。7种

  1. yum -y install nginx
  2. 配置一个Nginx ,启动stub_status模块
  3. 将每种状态分别 提取。 ```javascript

    1.开启nginx状态信息

    [root@manager ~/day2_if]# cat /etc/nginx/nginx.conf server { …

    location /ngx_status {

      stub_status;    
    

    } … }

Active connections – 活跃的连接数量 server accepts handled requests — 总共处理了7个连接 , 成功创建7次握手, 总共处理了36个请求。 reading — 读取客户端的连接数。 writing — 响应数据到客户端的数量。 waiting — 开启 keep-alive 的情况下,这个值等于 active – (reading+writing), 意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接。



[root@web01 shell-case]# curl   http://127.0.0.1:80/nginx_status  (-s 静默。不输出)<br />[root@web01 shell-case]# `cat case-5.sh`
```bash
#!/bin/bash

                Ngx_url=http://127.0.0.1
                Ngx_Port=80
                Ngx_Path=ngx_status

                case $1 in
                    Active|active)
                        curl -s  ${Ngx_url}:${Ngx_Port}/${Ngx_Path} | awk '/^Active/ {print $NF}'
                        ;;
                    Accepts|accepts)
                        curl -s  ${Ngx_url}:${Ngx_Port}/${Ngx_Path} | awk 'NR==3 {print $1}'
                        ;;
                    Handled|handled)
                        curl -s  ${Ngx_url}:${Ngx_Port}/${Ngx_Path} | awk 'NR==3 {print $2}'
                        ;;
                    Requests|requests)
                        curl -s  ${Ngx_url}:${Ngx_Port}/${Ngx_Path} | awk 'NR==3 {print $3}'
                        ;;
                    *)
                        echo "USAGE: $0 { Active | Accepts | Handled | Requests }"
                esac
        sh ngx_status.sh Active

3.使用case实现php-fpm状态监控脚本。

1.配置 php-fpm 状态⻚⾯。
2.取值 ( 需要⼤家先curl⼀下 存储到⽂件中,然后再awk处理。)

1.配置php-fpm,开启状态模块。
[root@web01 shell-case]# vim /etc/php-fpm.d/www.conf
pm.status_path = /phpfpm_status #增加⼀⾏,开启php-fpm的 状态⻚⾯( 访问的路
径 )
2.配置nginx
[root@web01 shell-case]# cat /etc/nginx/conf.d/nginx.oldxu.com.conf
server {
listen 80;
server_name nginx.oldxu.com;
location = /nginx_status {
stub_status;
}
location /phpfpm_status {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}3.重启服务
[root@web01 shell-case]# systemctl restart nginx php-fpm
4.访问测试:(⽤于内部监控,所以⽆需其他⼈访问,只需要本地127地址可以访问到就可以了)
[root@web01 shell-case]# curl -s -HHost:nginx.oldxu.com
http://127.0.0.1/phpfpm_status
pool: www
process manager: dynamic
start time: 05/Jun/2020:14:14:58 +0800
start since: 45
accepted conn: 9            #当前接收的连接数
listen queue: 0                #请求的队列,如果这个值不为0,那么你可能需要增加php的进程
数 (队列⻓度持续多⻓时间达到200)
max listen queue: 0        #最⼤的请求队列⻓度。
listen queue len: 128 #
idle processes: 4             #空闲的进程数
active processes: 1         #活跃的进程数
total processes: 5                 #总的进程数
max active processes: 1       #最⼤的活跃进程数是 1
max children reached: 0       #超过最⼤进程数的峰值次数,如果不为0,需要调整php-fpm的进程数 ( 超过5次以上就要触发报警 )
#!/bin/bash
Domain_Host=nginx.oldxu.com
case $1 in
idle_process)
curl -s -HHost:"${Domain_Host}" http://127.0.0.1/phpfpm_status | awk
'/idle processes/ {print $NF}'
;;
active_process)
curl -s -HHost:"${Domain_Host}" http://127.0.0.1/phpfpm_status | awk
'/^active processes/ {print $NF}'
;;
total_process)
curl -s -HHost:"${Domain_Host}" http://127.0.0.1/phpfpm_status | awk
'/^total processes/ {print $NF}'
;;
max_active_process)
curl -s -HHost:"${Domain_Host}" http://127.0.0.1/phpfpm_status | awk
'/^max active processes/ {print $NF}'
;;
accepted_conn)
curl -s -HHost:"${Domain_Host}" http://127.0.0.1/phpfpm_status | awk
'/^accepted conn/ {print $NF}'
;; listen_queue)
curl -s -HHost:"${Domain_Host}" http://127.0.0.1/phpfpm_status | awk
'/^listen queue:/ {print $NF}'
;;
*)
echo "USAGE sh $0 [ idle_process | active_process | total_process |
max_active_process | accepted_conn | listen_queue ]"
esac

4.使用case写一个rsync服务启停脚本。

启动 rsync —daemon
停⽌ pkill rsync
重启
[root@web01 shell-case]# cat case-8.sh

#!/bin/bash
. /etc/init.d/functions
case $1 in
start)
#启动要考虑什么问题 是否未启动 是否已启动
rsync_status=$(pidof rsync |wc -l) #检查进程是否启动 1 启动
0 未启动
if [ $rsync_status -eq 0 ];then
rsync --daemon
action "rsync 启动成功" /bin/true
else
action "rsync 已经启动" /bin/false
fi
;;
stop)
#考虑问题 已经启动,正常停⽌即可。 服务没有启动,停⽌直接提示没启动。
rsync_status=$(pidof rsync |wc -l) #检查进程是否启动 1 启动
0 未启动
if [ $rsync_status -eq 1 ];then
pkill rsync
action "rsync 停⽌成功" /bin/true
else
action "rsync 暂未启动" /bin/false
fi
;;
restart) #拷⻉问题
# ( 服务已经启动的情况下,可以实现先停⽌后启动)
#( 服务没有启动,需要重启怎么办? 不停⽌,只启动 )
rsync_status=$(pidof rsync |wc -l) #检查进程是否启动 1 启动
0 未启动
if [ $rsync_status -eq 1 ];then
#正常流程,停⽌,启动即可。
pkill rsync
sleep 1 #等待1s
rsync --daemon
action "Rsync 重启成功" /bin/true
elif [ $rsync_status -eq 0 ];then
action "Rsync 暂未启动" /bin/false
echo "--------尝试启动-------------"
sleep 1
rsync --daemon
action "Rsync 重启成功" /bin/true
fi
;;
*)
echo "USAGE: sh $0 [ start | stop | restart ]"
exit
esac

5. 编写脚本,根据用户输入的服务名称查询该服务的状态,如果服务不存在则直接报错。如果服务

启动则提示 [重启和停⽌操作],如果服务没有启动则提示 [启动和取消操作]
sh check_service.sh httpd | nginx
1.先判断查询的服务是否存在,如果不存在则直接报错。
[root@web01 shell-case]# **systemctl status httpddad**
Unit httpddad.service could not be found.
[root@web01 shell-case]# echo $?
4
2.如果服务存在并且是启动状态
提示: 重启还是停⽌,需要⽤户 交互的输⼊

[root@web01 shell-case]# **systemctl status httpd**
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor
preset: disabled)
Active: active (running)
Docs: man:httpd(8)
man:apachectl(8)
[root@web01 shell-case]# echo $?
0
3.如果服务没有启动 提示: 启动还是取消
[root@web01 shell-case]#systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor
preset: disabled)
Active: inactive (dead)
Docs: man:httpd(8)
man:apachectl(8)
[root@web01 shell-case]# **echo $?**
3

[root@web01 shell-case]#cat case-9.sh

#!/bin/bash
. /etc/init.d/functions

#查询服务仅能root⽤户执⾏
if [ $UID -ne 0 ];then
echo "$USER 对 $0 脚本没有权限"
exit
fi

#确保⽤户仅能传递⼀个参数
if [ $# -ne 1 ];then
echo "USAGE: $0 Service_Name [ nginx | httpd | vsftpd | rsyncd | ...
]"
exit
fi
systemctl status $1 &>/dev/null
rc=$?                                #将$?的结果存储⾄rc变量中,这样rc变量中就是$?的结
果不会发⽣任何变化
if [ $rc -eq 4 ];then
echo "Unit $1 could not be found."
elif [ $rc -eq 0 ];then
read -p "当前 $1 服务已是启动状态,请问需要 [ restart | stop ]: " action
case $action in
restart) systemctl restart $1
action "$1 restart ok" /bin/true
;;
stop)
systemctl stop $1
action "$1 stop ok" /bin/true
;;
*)
echo "输⼊指令错误..."
exit
esac
elif [ $rc -eq 3 ];then
read -p "当前 $1 服务暂未启动,请问需要 [ start | quit ]: " action2
case $action2 in
start)
systemctl start $1
action "$1 start ok" /bin/true
;;
quit)
exit
;;
*)
echo "输⼊指令错误..."
exit
esac
else
echo "$0 #脚本⽆法判断当前服务是什么情况,⾃动退出了"
exit
fi

**