Bash脚本-While循环以及并行执行脚本。

示例概述:

需要同时打开二个窗口即gnome-terminal并且同时执行二个fio脚本;当在执行fio脚本过程中,发现“link up”错误,发出报警声。

Fio介绍:FIO(Flexible I/O Tester)是一个用于测试磁盘、文件系统、块设备和网络设备性能的工具。它可以模拟不同类型的I/O负载,包括随机或顺序读写、混合读写、随机或顺序访问等。FIO提供了丰富的选项和参数,可以对测试进行高度定制化配置,以满足各种应用场景和需求。FIO是开源软件,可在Linux、Unix、Windows等多种平台上运行。fio性能测试-环境搭建,功能介绍,测试讲解_fio搭建-CSDN博客

脚本一:

同时打开二个终端窗口并且同时执行二个fio脚本

#!/bin/bash
gnome-terminal --geometry=80*25+10+10 -t "sdb0" -x bash -c "./fio_disk_test0; exec bash;"
gnome-terminal --geometry=80*25+10+10 -t "sdc0" -x bash -c "./fio_disk_test1; exec bash;"
echo "Starting test all disks......"
sleep 10
# Exit the script
exit

解析脚本:
gnome-terminal:

命令本身,启动GNOME终端程序。
--geometry=80*25+10+10:
这是一个窗口几何参数,用于设置终端窗口的大小和位置。
80*25 表示终端窗口的尺寸,即宽度为80个字符,高度为25行。
+10+10 表示终端窗口相对于屏幕左上角的偏移量,即距离左侧10像素,距离顶部10像素。
-t "sdb0":
-t 选项后面跟随的是一个字符串,用于指定终端窗口的标题。
在这里,设置标题为 "sdb0",方便识别该终端窗口正在执行与sdb0磁盘相关的任务。
-x bash:
-x 选项用于指定在新打开的终端窗口中执行一个外部命令。
bash 是指定要执行的命令,即启动一个新的bash shell。
-c "./fio_disk_test0; exec bash;":
-c 选项后面跟随着要在新启动的bash shell中执行的命令串。
"./fio_disk_test0; exec bash;"

 是一个复合命令,包含两部分:
./fio_disk_test0: 执行名为fio_disk_test0的脚本或程序,该脚本位于当前工作目录下。
exec bash;:

当fio_disk_test0执行完毕后,使用exec命令替换当前bash shell进程为一个新的bash shell进程。这样,即使fio_disk_test0脚本执行完毕且没有错误退出,终端窗口也不会立即关闭,用户仍可以在该窗口中继续进行交互式操作。

脚本二:

当在执行fio脚本过程中,发现“link up”错误,发出报警声。

#!/bin/bash
while true; do
  dmesg_output=$(dmesg -T)
    if [[ $dmesg_output == *"link up"* ]]; then
    bash /root/Desktop/warning_sound.sh
        break
    else
        echo "Normal"
    fi
    sleep 5
done
echo "stop check"

解析脚本:

while true; do

开启一个无限循环,使得脚本能够持续运行直到满足特定条件而退出。

dmesg_output=$(dmesg -T)

执行dmesg -T命令并将其输出赋值给变量dmesg_output。dmesg -T命令用于打印内核消息缓冲区的内容,并带有可读的时间戳。

if [[ $dmesg_output == *"link up"* ]]; then

bash /root/Desktop/warning_sound.sh

break

else

echo "Normal"

Fi

使用条件判断语句检查dmesg_output变量是否包含子字符串link up。如果包含,执行以下操作:

bash /root/Desktop/warning_sound.sh:使用bash命令执行并加载位于/root/Desktop/warning_sound.sh的脚本。这意味着warning_sound.sh脚本中的所有命令将在一个新的子shell进程中执行,其内部定义(变量、环境等)不会影响当前脚本的上下文。

break:当link up被检测到时,使用break语句跳出当前所在的最内层循环,即终止while true循环的执行。

如果dmesg输出中未找到link up,则执行:

echo "Normal":简单地在控制台输出字符串“Normal”,表明当前系统状态正常,未检测到目标字符串。

sleep 5

使用sleep命令让脚本暂停执行5秒,然后继续下一轮循环。

Done

echo "stop check"

结束while循环;在循环结束后(即检测到link up并跳出循环后),输出字符串“stop check”,表示已停止检查。

脚本三:

#!/bin/bash
while true;do
echo -ne '\x07' > /dev/console
read -t 2 -n 4 input
if [[ "$input" == "exit" ]];then
break
fi
done
解析脚本:

echo -ne '\x07' > /dev/console

使用echo -ne命令向/dev/console设备输出一个特殊的字符(\x07),该字符代表ASCII控制字符BEL(Bell),通常会导致计算机发出蜂鸣声。-n选项禁止echo在输出末尾添加换行符,-e选项允许使用转义序列(如\x07)。

read -t 2 -n 4 input

使用 read 命令等待用户从终端输入文本。

-t 2:设置超时时间为2秒,如果在这段时间内用户没有输入任何内容,read 命令将返回,此时input变量未被赋值。

-n 4:只读取最多4个字符作为用户输入。一旦用户输入了4个字符或者按下回车键,read 命令将结束并把输入的字符赋值给变量 input。

if [[ "$input" == "exit" ]]; then

break

fi

使用条件判断结构 if 检查变量 input 是否等于字符串 "exit"。

[[ "$input" == "exit" ]]:双方括号 [[ ... ]] 是bash特有的条件测试结构,此处用于字符串比较。"$input" 是之前读取到的用户输入,与字符串 "exit" 进行严格相等性检查。

如果用户输入的恰好是 "exit"(忽略大小写),则执行 break 语句,这将跳出当前所在的 while 循环,终止无限循环,脚本执行结束。

  • 47
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值