示例概述:
需要同时打开二个窗口即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 循环,终止无限循环,脚本执行结束。