# Shell 流程控制 - if-case
# 1.if 判断语句
# 1.1 什么是 if
if 就是模仿人类的判断来进行的,但它没有人类那么有情感,只有 True 和 False 这两种结果。
# 1.2 为何要使用 if
- 当我们在写程序的时候,经常需要对上一步的执行结果进行判断,那么判断就需要使用 if 语句来实现;
- if 语句在我们程序中主要就是用来做判断的;
- 不管大家以后学习什么语言,以后只要涉及到判断的部分,大家就可以直接拿 if 来使用;
- 不同的语言之间的 if 只是语法不同,原理是相同的。
# 1.3 if 的基础语法
# 1.3.1 单分支结构
# 单分支代码示例 | |
if [ $1 -eq $2 ];then | |
echo "ok" | |
fi |
# 1.3.2 双分支结构
# 双分支代码示例 | |
if [ $1 -eq $2 ];then | |
echo "ok!" | |
else | |
echo "error!" | |
fi |
# 1.3.3 多分支结构
# 多分支结构 | |
if [ 如果你有房 ];then | |
我就嫁给你 | |
elif [ 你有车 ];then | |
我就嫁给你 | |
elif [ 你有钱 ];then | |
我就嫁给你 | |
else | |
再见 | |
fi |
# 1.4 if 分支场景
# 1.4.1 单分支脚本案例
需求:判断当前用户是不是 root,如果不是那么返回 ERROR
[root@client ~]# cat if-1.sh | |
if [ $USER != 'root' ];then | |
echo "ERROR" | |
exit 1 | |
fi |
# 1.4.2 双分支脚本案例
需求:判断当前登录用户是管理员还是普通用户
- 如果是管理员输出 hey admin
- 如果是普通用户输出 hey guest
[root@client ~]# cat if-2.sh | |
if [ $USER == 'root' ];then | |
echo "hey admin" | |
else | |
echo "hey guest" | |
fi |
# 1.4.3 多分支脚本案例
需求:通过脚本传入两个参数,进行整数关系比较。
比如: if.sh [1 2 | 2 2 | 2 3],请使用双分支和多分支两种方式实现。
[root@client ~]# cat if-1.sh | |
#!/usr/bin/bash | |
# 双分支 (嵌套) | |
if [ $1 -eq $2 ];then | |
echo "$1 = $2" | |
else | |
if [ $1 -gt $2 ];then | |
echo "$1 > $2" | |
else | |
echo "$1 < $2" | |
fi | |
fi |
多分支结构实现
[root@client ~]# cat if-1.sh | |
#!/usr/bin/bash | |
if [ $1 -eq $2 ];then | |
echo "$1 = $2" | |
elif [ $1 -gt $2 ];then | |
echo "$1 > $2" | |
else | |
echo "$1 < $2" | |
fi |
# 1.5 if 基于文件比较
if 语句中的文件比较
- -e:如果文件或目录存在则为真
- -s:如果文件存在且至少有一个字符则为真
- -d:如果文件存在且为目录则为真
- -f:如果文件存在且为普通文件则为真
- -r:如果文件存在且可读则为真
- -w:如果文件存在且可写则为真
- -x:如果文件存在且可执行则为真
# 1.5.1 备份脚本案例 1
需求 1:备份文件至 /backup/system/filename-2019-10-29,如果该目录不存在则自动创建。
- 1. 源文件,让用户手动输入;
- 2. 如果备份文件存在则继续,如果备份文件不存在则提示 No such file,然后退出;
- 3. 如果备份文件不为空则继续,如果备份文件为空则提示 "This is file empty",然后退出;
- 4. 目标位置:/backup/system/ 判断, 判断该目录是否存在,如果不存在则创建;
[root@client ~]# cat if-3.sh | |
#!/usr/bin/bash | |
Dest_Dir=/backup/system/ | |
Date=$(date +%F) | |
read -p "请输入你要备份的文件: " src_file | |
#1. 判断文件是否存在 | |
if [ ! -f ${src_file} ];then | |
echo "${src_file} is not found.." | |
exit | |
fi | |
#2. 判断文件是否为空,如果为空就不用备份,退出即可 | |
if [ ! -s ${src_file} ];then | |
echo "${src_file} Content Null..." | |
exit | |
fi | |
read -p " 是否将 ${src_file} 文件备份到 ${Dest_Dir}/filename-${Date} [ yes | no ]" Action | |
#3. 判断目标的目录是否存在 | |
if [ ! -d ${Dest_Dir} ];then | |
mkdir -p ${Dest_Dir} | |
fi | |
#4. 执行备份操作 | |
if [ $Action == "yes" ];then | |
cp -rp $src_file $Dest_Dir/filename-${Date} | |
fi |
# **1.5.2 ** 为执行脚本添加锁
[root@client ~]# cat if-4.sh | |
#!/usr/bin/bash | |
#1. 判断是否存在锁 | |
if [ -f /tmp/test.lock ];then | |
echo "该脚本正在运行,请稍后再试..." | |
exit | |
fi | |
#2. 加锁 | |
touch /tmp/test.lock | |
#3. 业务逻辑 | |
sleep 20 | |
#4. 解锁 | |
if [ -f /tmp/test.lock ];then | |
rm -f /tmp/test.lock | |
fi |
# 1.6 if 基于整数比较
if 语句中的整数比较 [整数 1 操作符 整数 2]
- -eq:等于则条件为真,示例:[1 -eq 10]
- -ne:不等于则条件为真,示例:[1 -ne 10]
- -gt:大于则条件为真,示例:[1 -gt 10]
- -lt:小于则条件为真,示例:[1 -lt 10]
- -ge:大于等于则条件为真,示例:[1 -ge 10]
- -le:小于等于则条件为真,示例:[1 -le 10]
# 1.6.1 检查服务状态脚本
需求:用户执行脚本 sh status.sh nginx 则检查 nginx 服务的运行状态。(仅支持传递一个参数)
- 1. 控制能传递的参数;
- 2. 返回状态为 3,表示没有运行;
- 3. 返回状态为 0,表示正在运行;
- 4.. 返回状态为 4,表示暂未安装此服务;
[root@client ~]# cat if-6.sh | |
#!/usr/bin/bash | |
#1. 控制能传递的参数个数 | |
if [ $# -ne 1 ];then | |
echo "Usage: $0 [ nginx | tomcat | php-fpm | mysql ]" | |
exit | |
fi | |
#2. 业务逻辑判断 | |
systemctl status $1 &>/dev/null | |
Result=$? | |
if [ $Result -eq 0 ];then | |
echo "$1 Service Is Running..." | |
fi | |
if [ $Result -eq 3 ];then | |
echo "$1 Service Is Not Running..." | |
fi | |
if [ $Result -eq 4 ];then | |
echo "$1 Service Is Not Installed" | |
read -p "是否需要安装 $1 这个服务 [Default yes]: " Action | |
if [ ${Action:=yes} == "yes" ];then | |
yum install $1 -y | |
fi | |
fi |
# 1.6.2 配置 yum 仓库脚本
需求:根据相同的系统不同版本,配置不同的 yum 源
[root@manager if]# cat if-23.sh | |
#!/usr/bin/bash | |
system_version=$(cat /etc/redhat-release | awk '{print $(NF-1)}') | |
# -ne 不等于 -eq 等于 | |
if [ ${system_version%%.*} -eq 7 ];then | |
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo &>/dev/null | |
echo "CentOS ${system_version} Epel OK" | |
fi | |
if [ ${system_version%%.*} -eq 6 ];then | |
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo | |
echo "CentOS ${system_version} Epel OK" | |
fi |
# 1.6.3 获取进程详情脚本
需求:获取进程的详情
- 1. 首先要传递 1 个参数,服务的名称;
- 2. 判断:是否存在该进程,如果不存在则警告,然后退出脚本;
- 3. 获取进程的 pid 相关的信息;
- 4. 获取该服务的运行状态;
- 5. 提取运行的用户:pid,STAT,command 命令;
[root@client ~]# cat if-11.sh | |
#!/bin/bash | |
#******************************************************************** | |
#Author : XuYong | |
#Date : 2025-09-24 | |
#FileName : if-11.sh | |
#Description: The test script | |
#******************************************************************** | |
#!/usr/bin/bash | |
#1. 接受传递的参数总个数为 1 | |
if [ $# -ne 1 ];then | |
echo "Usage: $0 [ serviceName...]" | |
exit | |
fi | |
#2. 判断服务名称是否存在对应的 id 编号 | |
#service_status=$(ps aux | grep "$1" | grep -v grep | grep -v "$$" | wc -l) | |
service_status=$(pstree -l "$1" | wc -l) | |
tmp_file=/tmp/$1_status.txt | |
#3. 判断该服务是否正在运行 | |
if [ $service_status -gt 0 ];then | |
# 业务逻辑 | |
service_runtime=$(systemctl status $1 | grep Active | awk '{print $2,$3}'|sed 's/[()]//g') | |
echo "当前 $1 进程的状态是:" | |
echo "$1 : $service_runtime" | |
echo "****************************************************" | |
echo "当前 $1 进程的详情是: " | |
ps aux|grep $1 | grep -v grep | grep -v "$$" | awk 'BEGIN {printf "%-15s%-15s%-20s\n","进程的用户","进程的PID","进程的命令"} {printf "%-20s%-20d%-20s\n",$1,$2,$NF}' > ${tmp_file} | |
cat ${tmp_file} | |
echo "***************************************************" | |
# 删除临时文件 | |
rm -f ${tmp_file} | |
else | |
echo "该 $1 服务暂未运行..." | |
fi | |
#打印效果 | |
[root@client ~]# sh if-11.sh nginx | |
当前 nginx 进程的状态是: | |
nginx : active running | |
**************************************************** | |
当前 nginx 进程的详情是: | |
进程的用户 进程的PID 进程的命令 | |
root 3842 /etc/nginx/nginx.conf | |
nginx 3843 process | |
nginx 3844 process | |
*************************************************** |
# 1.6.4 数字排序脚本
需求:输入三个数并进行升序排序
- 1. 控制只能输入三个参数;
- 2. 将行,转为列的显示方式;
- 3.sort 排序;
[root@client ~]# cat if-8.sh | |
#!/usr/bin/bash | |
if [ $# -ne 3 ];then | |
echo "Error..." | |
exit | |
fi | |
echo "$1 $2 $3" | xargs -n1 | sort -rn |
# 1.7 if 基于字符比较
if 语句中的字符串比较 [整数 1 操作符 整数 2]
- ==:等于则条件为真,示例 [ "b" ]
- !=:不相等则条件为真,示例 [ "b"]
- -z:字符串的长度为零则为真(内容空则为真),示例 [-z "$a"]
- -n:字符串的长度不为空则为真(有内容则为真),示例 [-n "$a"]
# 1.7.1 检查执行身份是否为 root
需求:判断用户是否为 root 超级管理员;
- 如果是则提示 hey admin
- 如果不是则提示
[root@client ~]# cat if-9.sh | |
#!/bin/bash | |
#******************************************************************** | |
#Author : XuYong | |
#Date : 2025-09-24 | |
#FileName : if-9.sh | |
#Description: The test script | |
#******************************************************************** | |
if [ $USER == "root" ];then | |
echo "hey admin" | |
else | |
echo "hey guest" | |
fi |
# 1.7.2 判断用户输入是否为空脚本
[root@client ~]# cat if-3.sh | |
#!/bin/bash | |
read -p "请输入一个字符: " Action | |
if [ -z $Action ];then | |
echo "请不要直接回车..." | |
exit | |
fi | |
echo "你输入的是:${Action}" |
# 1.7.3 检查 selinux 是否为 disabled
需求:检查是否为 disabled 状态;
- 是:则输出 该状态已经是 disabled,不做修改;
- 不是:则修改状态为 disabled,并返回一段提示,说 selinux 已经修改为 disabled;
[root@client ~]# cat if-10.sh | |
#!/usr/bin/bash | |
Selinux_File=/etc/selinux/config | |
Selinux_status=$(grep "^SELINUX=" ${Selinux_File} | awk -F '=' '{print $NF}') | |
if [ ${Selinux_status} == "disabled" ];then | |
echo "你的SELINUX是关闭状态" | |
else | |
echo "SELINUX状态是: ${Selinux_status} 不符合预期,则尝试修改中.." | |
sed -i '/^SELINUX=/c SELINUX=disabled' ${Selinux_File} | |
sleep 2 | |
echo "修改成功,SELINUX已经是Disabled关闭的" | |
fi |
# 1.8 if 基于正则比较
if 语句中的正则比较 [[变量 =~ 正则匹配的内容]]
[["$USER" =~ ^r]]:判断用户是否已 r 开头; ro,rt,ra,root,
[[ " ]]:判断用户输入的是否为全数字;
注意:单中括号使用正则语法会报错,bash: [:=~: binary operator expected
# 1.8.1 控制用户输入必须为整数脚本
需求:通过正则方式控制用户输入的必须是数字。
[root@client ~]# cat if-7.sh | |
#!/usr/bin/bash | |
read -p "请输入手机号码:" num | |
if [[ ! ${num} =~ ^[0-9]+$ ]];then | |
echo "你输入不是一个有效电话..." | |
exit | |
fi | |
if [ ${#num} -ne 11 ];then | |
echo "你输入电话长度不是13位..." | |
exit | |
fi | |
echo "你输入的电话号码是${num}" |
# 1.8.2 遍历单词筛选其中关键字脚本
需求:使用 for 循环打印一推单词,然后仅输出以 r 开头的单词。
[root@client ~]# cat if-11.sh | |
#!/bin/bash | |
for i in r rt ttr rtt aar aaq abr root r0o | |
do | |
# 判断 | |
if [[ $i =~ ^r ]];then | |
echo $i | |
fi | |
done |
# 1.8.3 批量创建用户脚本
需求:编写一个创建用户的脚本。
- 1. 提示用户输入要创建用户的前缀,必须是英文;
- 2. 提示用户输入后缀,必须是数字;
- 3. 如果前缀和后缀都没有问题,则进行用户创建;
- 4. 并且密码是随机的;
[root@client ~]# cat useradd.sh | |
#!/usr/bin/bash | |
. /etc/init.d/functions | |
# 让用户输入前缀名称 xuyong | |
# 让用户输入创建的数量 10 | |
read -p "请输入要创建的用户名称[default: xuyong]: " UserName | |
read -p "请输入要创建的用户数量[default: 10]: " UserNumber | |
read -p "请输入要创建的密码长度[default: 8]: " PassNumber | |
read -p "你要创建的用户是 ${UserName:=xuyong} 随机密码 ${PassNumber:=8} 创建 ${UserNumber:=10} ,确定创建吗? [ yes(default) | no ]: " Action | |
# 判断用户输入的是 yes 还是 no | |
if [ "${Action:=yes}" == "yes" ];then | |
# 循环 | |
for number in $(seq ${UserNumber}) | |
do | |
# 随机密码 - l 长度 -c 小写个数 -C 大小个数 | |
UserPass=$(mkpasswd -l ${PassNumber} -C 1 -c 1 ) | |
# 判断用户是否存在 | |
id "${UserName}_${number}" &>/dev/null | |
if [ $? -eq 0 ];then | |
action "用户: ${UserName}_${number} is already exists.." /bin/false | |
else | |
# 创建用户 | |
useradd "${UserName}_${number}" &>/dev/null | |
# 设定密码 | |
echo "${UserPass}" | passwd --stdin "${UserName}_${number}" &>/dev/null | |
echo "${UserName}_${number} : ${UserPass}" >> /tmp/user_pass.txt | |
action "用户: ${UserName}_${number} User creation successful" /bin/true | |
fi | |
done | |
fi |
# 1.8.4 批量删除用户脚本
需求:编写一个删除用户的脚本。
[root@client ~]# cat useradd_del.sh | |
#!/usr/bin/bash | |
. /etc/init.d/functions | |
# 让用户输入前缀名称 xuyong | |
# 让用户输入创建的数量 10 | |
# 使用有密码。且随机,长度 15 大写 5 小写 5 数字 3 特殊字符 2 | |
read -p "请输入要删除的用户名称[default: xuyong]: " UserName | |
read -p "请输入要删除的用户数量[default: 10]: " UserNumber | |
read -p "你要删除的用户是 ${UserName:=xuyong} 创建 ${UserNumber:=10} ,确定创建吗? [ yes(default) | no ]: " Action | |
# 判断用户输入的是 yes 还是 no | |
if [ "${Action:=yes}" == "yes" ];then | |
# 循环 | |
for number in $(seq ${UserNumber}) | |
do | |
id "${UserName}_${number}" &>/dev/null | |
# 如果用户存在则为 0,不存在则为 1 | |
if [ $? -eq 0 ];then | |
userdel "${UserName}_${number}" &>/dev/null | |
action "用户: ${UserName}_${number} is delete successful" /bin/true | |
else | |
action "用户: ${UserName}_${number} is not found.." /bin/false | |
fi | |
done | |
fi |
# 1.8.5 批量删除目录脚本
需求:编写一个删除目录的脚本。
[root@client ~]# cat user_del_dir.sh | |
#!/usr/bin/bash | |
. /etc/init.d/functions | |
home_dir=$(ls /home | xargs -n1) | |
for dir in ${home_dir} | |
do | |
# 删除以 d 开头或以 x 开头的目录 | |
if [[ $dir =~ ^d ]] || [[ $dir =~ ^x ]];then | |
rm -rf /home/$dir | |
action "删除 /home/$dir delete successful" /bin/true | |
fi | |
sleep 0.2 | |
done |
# 1.9 if 判断相关脚本案例
需求:在每月第一天备份并压缩 /etc 目录的所有内容,存放到 /backup 目录,存放的形式 2019_04_10_etc.tar.gz,脚本名称为 fileback,
存放在 /root 的家目录下。
[root@client ~]# cat fileback.sh | |
#!/usr/bin/bash | |
Date=$(date +%F) | |
Dir=/backup | |
Lock_File=/tmp/back.lock | |
Log_File=/var/log/${0}.log | |
Log_Format(){ | |
echo "$(date +%F_%T) $(hostname) $0: $1" >> ${Log_File} | |
} | |
# 1. 判断操作的用户身份 | |
if [ ! $USER == "root" ];then | |
Log_Format "请使用Root身份运行.." | |
exit | |
else | |
Log_Format "Root开始执行备份脚本---->" | |
fi | |
# 2. 加锁 | |
if [ -f $Lock_File ];then | |
echo "该脚本 $0 正在执行备份操作--->" | |
exit | |
fi | |
#第一次备份时,没有锁,所以需要添加 | |
touch $Lock_File | |
#3. 判断备份的目录是否存在 | |
if [ ! -d ${Dir} ];then | |
mkdir -p ${Dir} | |
fi | |
#4. 执行 tar 打包 | |
Log_Format "Root开始执行tar命令打包---->" | |
sleep 2 | |
#5. 判断打包是否成功 | |
cd / && tar czf ${Dir}/${Date}_etc.tar.gz etc | |
if [ -f ${Dir}/$Date_etc.tar.gz ];then | |
Log_Format "备份文件${Dir}/${Date}_etc.tar.gz 成功---->" | |
else | |
Log_Format "备份文件${Dir}/${Date}_etc.tar.gz 失败---->" | |
fi | |
# 程序执行成功后记得解锁 | |
rm -f $Lock_File |
打印日志日志示例:
[root@client ~]# cat /var/log/fileback.sh.log | |
2025-09-24_18:15:28 client fileback.sh: Root开始执行备份脚本----> | |
2025-09-24_18:15:28 client fileback.sh: Root开始执行tar命令打包----> | |
2025-09-24_18:15:31 client fileback.sh: 备份文件/backup/2025-09-24_etc.tar.gz 成功----> |
# 3.case 判断语句
# 3.1 什么是 case
- case 语句和 if 多分支判断语句类似,主要用来做多条件判断;
- 只不过 case 在 Shell 脚本中比 if 多分支条件判断更方便。
# 3.2 case 使用场景
- 在生产环境中,我们会根据” 一个问题 “ 做多种预案,然后根据用户选择来加载不同的预案。
- 比如服务的启停脚本,我们首先要写好启动、停止、重启的预案,然后根据用户选择来加载不同的预案。
# 3.3 case 基础语法
[root@client ~]# cat case.sh | |
#!/bin/bash | |
#******************************************************************** | |
#Author : XuYong | |
#Date : 2025-09-24 | |
#FileName : case.sh | |
#Description: The test script | |
#******************************************************************** | |
read -p "请输入数字:" num | |
case $num in | |
1) | |
echo "1" | |
;; | |
2) | |
echo "2" | |
;; | |
3) | |
echo "3" | |
;; | |
*) | |
echo "error" | |
exit | |
esac |
case 示例: (PS: 建议先使用 if 实现如下例子)
[root@bgx shell]# cat case.sh | |
#!/bin/bash | |
cat <<eof | |
**************** | |
** 1. backup ** | |
** 2. copy ** | |
** 3. quit ** | |
**************** | |
eof | |
read -p "Input a choose: " OP | |
case $OP in | |
1|backup) | |
echo "BACKUP......" | |
;; | |
2|copy) | |
echo "COPY....." | |
;; | |
3|quit) | |
exit | |
;; | |
*) | |
echo error! | |
esac |
# 3.4 case 场景实践
# 3.4.1 场景 1 - 编写 nginx 启停脚本
[root@client ~]# cat nginx.sh | |
#!/usr/bin/bash | |
. /etc/init.d/functions | |
ngx_pid=/var/run/nginx.pid | |
ngx_tmp=/tmp/ngx.status | |
case $1 in | |
start) | |
# 判断服务是否存活 | |
if [ ! -f $ngx_pid ];then | |
nginx -t &>${ngx_tmp} | |
if [ $? -ne 0 ];then | |
ngx_file=$(cat /tmp/ngx.status | awk '/emerg/' | awk '{print $NF}' | awk -F ":" '{print $1}') | |
ngx_line=$(cat /tmp/ngx.status | awk '/emerg/' | awk '{print $NF}' | awk -F ":" '{print $2}') | |
read -p "Nginx的 ${ngx_file} 的第 ${ngx_line} 行出现了错误,是否需要进入编辑 [ y | n ]:" Action | |
if [ ${Action:=y} == "y" ];then | |
vim ${ngx_file} +${ngx_line} | |
else | |
exit | |
fi | |
else | |
# 启动 | |
/usr/sbin/nginx | |
# 查看进程 | |
ngx_process_pid=$(cat ${ngx_pid}) | |
ngx_process_mess=$(ps aux |grep ${ngx_process_pid} | grep -v grep|wc -l) | |
if [ $ngx_process_mess -ge 1 ];then | |
action "Nginx启动成功" /bin/true | |
else | |
action "Nginx启动失败" /bin/false | |
fi | |
fi | |
else | |
action "Nginx已启动" /bin/false | |
fi | |
;; | |
stop) | |
;; | |
status) | |
;; | |
*) | |
echo "Usage $0 [ start | stop | restart ]" | |
exit | |
esac |
# 3.4.2 场景 2 - 编写 rsync 启停脚本
[root@client ~]# cat rsync.sh | |
#!/usr/bin/bash | |
. /etc/init.d/functions | |
Rsync_Pid_File=/var/run/rsyncd.pid | |
start_rsync() { | |
# 判断 pid 是否存在,如果存在说明服务已经启动过了 | |
if [ -f $Rsync_Pid_File ];then | |
action "Rsync正在运行中,不用重复启动.." /bin/false | |
else | |
/usr/bin/rsync --daemon | |
Rsync_Status=$(netstat -lntp |grep 873 | grep -w "^tcp" | wc -l) | |
if [ $Rsync_Status -eq 1 ];then | |
action "Rsync 启动成功" /bin/true | |
else | |
action "Rsync 启动失败" /bin/false | |
fi | |
fi | |
} | |
stop_rsync() { | |
# 判断是否存活 | |
if [ -f $Rsync_Pid_File ];then | |
#停止 | |
kill $(cat ${Rsync_Pid_File}) | |
sleep 0.5 | |
Rsync_Status=$(netstat -lntp |grep 873 | grep -w "^tcp" | wc -l) | |
if [ $Rsync_Status -eq 0 ];then | |
action "Rsync 停止成功" /bin/true | |
else | |
action "Rsync 停止失败" /bin/false | |
fi | |
else | |
# 已经是停止状态 | |
action "Rsync 已经是停止状态" /bin/false | |
fi | |
} | |
case $1 in | |
start) | |
start_rsync | |
;; | |
stop) | |
stop_rsync | |
;; | |
restart) | |
if [ -f $Rsync_Pid_File ];then | |
stop_rsync | |
start_rsync | |
else | |
start_rsync | |
fi | |
;; | |
status) | |
if [ -f $Rsync_Pid_File ];then | |
rsync_process_id=$(cat ${Rsync_Pid_File}) | |
echo "" | |
echo "****************Rsync Status ****************************" | |
rsync_process_message=$(ps aux|grep ${rsync_process_id} | grep -v grep) | |
echo "${rsync_process_message}" | |
echo "*******************************************************" | |
else | |
action "Rsync 暂未启动.." /bin/false | |
fi | |
;; | |
*) | |
echo "Usage $0 [ start | status | restart | stop ]" | |
exit | |
esac |
# 3.4.3 场景 3 - 编写 LVS 启停脚本
[root@client ~]# cat lvs_rs.sh | |
#!/bin/bash | |
net_eth1=eth1:1 | |
net_vip=172.16.1.33 | |
net_port=80 | |
rs_ip="172.16.1.5 172.16.1.6 172.16.1.7 172.16.1.8" | |
case $1 in | |
start) | |
#1. 配置 vip | |
cat > /etc/sysconfig/network-scripts/ifcfg-${net_eth1} <<-EOF | |
TYPE=Ethernet | |
BOOTPROTO=none | |
DEFROUTE=yes | |
NAME=${net_eth1} | |
DEVICE=${net_eth1} | |
ONBOOT=yes | |
IPADDR=${net_vip} | |
PREFIX=24 | |
EOF | |
# 启动 LVS-VIP | |
ifup ${net_eth1} | |
#2. 配置 ipvsadm 规则 | |
ipvsadm -A -t ${net_vip}:${net_port} | |
for host in ${rs_ip} | |
do | |
ipvsadm -a -t ${net_vip}:80 -r ${host}:${net_port} | |
done | |
# 3. 打印 LVS 规则 | |
clear | |
ipvsadm -L -n | |
;; | |
stop) | |
ifdown ${net_eth1} | |
sleep 0.5 | |
rm -f /etc/sysconfig/network-scripts/ifcfg-${net_eth1} | |
ipvsadm -C | |
;; | |
*) | |
echo "Usage $0 [ start | stop ]" | |
exit | |
esac |
# 3.4.4 场景 4 - 编写 Jar 包启停脚本
[root@client ~]# cat service_start.sh | |
#!/usr/bin/bash | |
# 描述:服务启动脚本 | |
# by: Oldxu Email: xuy@nf-leasing.com | |
#定义变量 | |
JAR_NAME=$2 | |
JAVA_OPTS="-Xms256m -Xmx1024m -Dspring.profiles.active=prd -Djava.security.egd=file:/dev/./urandom -Duser.timezone=GMT+08" | |
COUNT=$(ps -ef |grep '${JAR_NAME}' |grep -v grep|wc -l) | |
PID=$(pgrep -l ${JAR_NAME}) | |
#使用说明,用来提示数据参数 | |
usage() { | |
echo "Usage: $0 stop|restart|status JARPATH/JAR_NAME" | |
exit 1 | |
} | |
#启动应用 | |
start() { | |
if [ "${COUNT}" -ne 0 ]; then | |
echo "${JAR_NAME}正在运行,进行ID是${PID}" | |
else | |
echo "$正在启动{JAR_NAME}" | |
nohup java ${JAVA_OPTS} -jar $2 &> /dev/null & | |
fi | |
} | |
#停止应用 | |
stop() { | |
if [ "${COUNT}" != 0 ]; then | |
kill -9 ${PID} &> /dev/null | |
sleep 10 | |
echo "${JAR_NAME}已经停止" | |
else | |
echo "${JAR_NAME}未运行" | |
fi | |
} | |
#应用状态 | |
status () { | |
if [ "${COUNT}" != 0 ]; then | |
echo "${JAR_NAME}正在运行,进程ID是${PID}" | |
else | |
echo "${JAR_NAME}已经停止" | |
fi | |
} | |
#重启应用 | |
restart() { | |
stop | |
start | |
} | |
#启动参数 | |
case "$1" in | |
start) | |
echo "************************Start Service************************" | |
start | |
;; | |
stop) | |
echo "************************Stop Service************************" | |
stop | |
;; | |
restart) | |
echo "************************Restart Service************************" | |
restart | |
;; | |
status) | |
echo "************************Service Status************************" | |
status | |
;; | |
*) | |
echo "************************Script Usage************************" | |
usage | |
;; | |
esac |
