两天入门shell-编写服务器监控脚本-发邮件通知
这是新年领导交给我的第一份任务,让我尽快写出一个shell脚本来监控服务器状态,在出现异常的时候,能第一时间给我的邮箱发邮件来通知我。
现在我就记录一下我两天是如何写出这样一套监控脚本的。
我对shell是零基础的,目前只会一些基础的linux命令,只能够实现简单的服务器部署。上头交代了任务,我就硬着头皮现学现用咯。
实现目标:
- 监控apache web服务
- 监控mysql数据库
- 监控服务器连接状态(能否正常请求接口)
- 监控某个重要接口的状态
- 监控服务器的内存使用
- 监控服务器硬盘使用情况
两天实现的目标有点庞大,从基础知识一点一点来。
一、shell是什么
Linux系统的shell作为操作系统的外壳,为用户提供了使用操作系统的接口。
它是命令语言、命令解释程序以及程序设计语言的统称,
负责用户和操作系统之间的沟通,把用户下达的命令解释给系统去执行,并将系统传回的信息再次解释给用户。
所以,shell不仅可看作用户环境,也可称为命令解释器。
二、shell基础
1. 了解shell的基本概念
shell分为交互式和非交互式。
交互式,指命令行输入,然后执行,这是需要和用户交互的。
非交互式,指读取文件中的命令执行,例如执行脚本。
shell实际上是一种编程语言。
shell有很多种,Korn shell比较接近一般程序设计语言,具有子程序的功能,提供了较多的数据类型。
Bourne shell数据类型较少,只有字符串和布尔类型。
shell的两种主要语法类型有Bourne和C,这两种类型互不兼容。
Bourne家族有:sh、ksh、Bash、psh、zsh;
C家族有:csh、tcsh。
整体测试下,ksh表现较佳,其次是csh和sh。
如果考虑速度的话,应该使用sh。因为是基本的shell,所以运行速度很快。
Linux领域最常见的shell是bash(Bourne Again shell)。
shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,那么shell就是围绕内核的外层。
2. shell使用基础
进入和退出shell
进入shell
(1)终端进入。
进入Linux桌面环境之后,选择【应用程序】|【附件】|【终端】启动shell。
(2)虚拟控制台进入
默认情况下,Linux有六个虚拟控制台,分别是tty1~tty6。
使用root登录之后,进入/etc/inittab文件,找到语句“id:5:initdefault:”,将5改成3。重新启动后,再登录进去就是虚拟控制台登录界面。按Alt+F2,切换到tty2,如果要退回到控制台tty1,按Alt+F1。
退出shell,执行exit命令。
查看linux支持的shell
vi /etc/shells
shell命令行
(1)shell模式匹配支持
“$”有两个不同的含义:表达式中的单个字符模式匹配和脚本中的变量赋值。
其他通配符
(2)输入输出
a.标准输入输出
键盘——标准输入——/dev/stdin
显示器——标准输出——/dev/sdtout
显示器——标准错误输出——/dev/sdterr
b.重定向输入和输出
命令行使用输入和输出重定向可以创建文件、重写文件或者向文件追加数据。
适合无人值守时开启定时任务,命令运行的输出结果可以写到日志文件里,方便后期查看。
重定向输入输出(之后有部分篇幅参考慕课网课程Linux达人养成计划I)
输入重定向 示例
wc [选项] [文件名]
选项:
-c 统计字节数
-w 统计单词数
-l 统计行数
例如 wc -l test.log
wc < test.log 不加<也能统计
wc << ddy 可以一直输入,直到输入ddy的时候统计所有的字节
(3)常用命令
(4)修改别名
运行alias 能看到每个命令的别名。
修改目录显示的颜色(蓝色很不明显)
ls –color=never /
只执行这一行的话,每次虚拟机重启,目录颜色还是蓝色。
运行
alias ls=’ls –color=never’
(5)别名永久生效和删除别名
vi /root/.bashrc : 写入环境变量配置文件,需要重启生效,用命令source .bashrc也可以生效。
unalias [别名] : 删除别名,这个也是临时删除,需要打开文件,删掉别名那一行
再运行alias,就能发现ls的别名被修改了,再查看目录的时候,目录颜色就会变成白色了。
(6)常用快捷键
(7)历史命令
history [选项] [历史命令保存文件]
选项:
-c :清空历史命令
-w :把缓存中的历史命令写入历史命令保存文件 ~/.bash_history
打开.bash_history看到的是虚拟机上次关机时保存的命令,而用history命令,能够看到之前和当前最新的命令。
历史命令调用
a.使用上下箭头调用以前的命令
b.使用“!n”执行第n条历史命令
c.使用“!!”执行上一条命令
d.使用“!字符串”执行该字符串开头的最后一条命令
(8)管道符
多命令顺序执行
管道符命令格式:
命令1 | 命令2
命令1的正确输出作为命令2的操作对象。
需要注意的是,命令2必要能执行命令1的输出,命令2要严格。
比如:ls -l /home | more
查看当前连接到服务器的用户数量:
netstat -an | grep ESTABLISHED | wc -l
3. 掌握shell程序的基本语法
(1)shell的用户变量
shell与其他编程的主要区别:shell的变量没有类型。
声明变量:aa=fish
变量只读性:readonly aa
引用变量值 ${aa}
用{}可以实现字符串合并
如echo ${aa}day
输出fishday
变量名规范:由字母字母和下划线组成,变量名不能以数字开头。
声明多个变量,用空格分开。
如:aa=fish bb=cat
变量的条件替换
第一种:{variable:-value}不替换默认值
第二种:{variable:=value}替换默认值
(2)shell的环境变量和内部变量
环境变量和内部变量都是shell定义好了的。类似于java中的关键词。
说说内部变量,这个可能用到。
(3)位置参数
上一个示例从命令行传参数的到程序,如果在程序里取参,可以这么写一段程序参考。
#program param.sh
if[ $# -eq 0 ]
then
echo "no param"
else
echo "param 1 is "$1
echo "param 2 is "$2
fi
命令行输入bash param.sh fish cat
打印
param 1 is fish
param 2 is cat
(4)变量表达式
a.字符串比较
示例代码
#!/bin/sh
str1=opt
str2=opr
if [ $str1 = $str2 ]
then
echo "str1 equal to str2"
else
echo "str1 not equal to str2"
fi
if [ $str1 != $str2 ]
then
echo "str1 not equal to str2"
else
echo "str1 equal to str2 "
fi
if [ $str1 ]
then
echo "str1 is not empty"
else
echo "str1 is empty"
fi
if [ -n $str1 ]
then
echo "str1 length greater than 0"
else
echo "str1 length equal to 0"
fi
if [ -z $str2 ]
then
echo "str2 length is equal to 0"
else
echo "str2 length greater than 0"
fi
运行结果:
b.数值比较
示例代码
运行结果:
c.文件操作
示例代码
运行结果如下:
d.逻辑操作
4. 学会应用shell的控制结构语句
(1)循环语句
a. for语句
- 语法形式1:
对list中的每个对象都执行操作。
for curvar in list
do
statements(执行语句)
done
- 语法形式2:
对传递给shell程序的每个位置参数都执行一次。
for curvar
do
statements(执行语句)
done
相当于:
for curvar in $@
do
statements(执行语句)
done
$@是传递给shell程序的位置参数列表。
- 语法形式3:
for var in one two three four five
do
statements(执行语句)
done
这个程序的for语句,先定义了一个var的变量,它的值依次是one、 two、 three 、four、 five。这五个变量值都会依次执行。
示例代码:
执行语句:bash test1.sh fish cat
执行结果:
b. while语句
指定条件为真时,才执行语句。
语法形式:
while 条件
do
执行语句
done
示例代码:
注意语句result=’expr $result + $num
‘,这里用的而是反引号,而不是单引号。反引号是tab键上方的那个键。
运行结果:
c. until语句
执行一系列语句直到指定条件为真。
语法形式:
until 条件
do
执行语句
done
和while的区别:while条件成立时执行,不成立时停止;而until条件不成立时执行,成立时停止。
示例:
执行结果:
d. shift语句
shift语句用于处理位置参数,一次一个从左到右处理。
shift命令的作用是使每个位置参数向左移动一个位置,当前的$1参数丢弃。
语法形式:
shift number
number指需要移动的位置数,如果没有number,默认为1。
代码示例
执行结果:
(2)条件语句
a. if语句
- 语法形式:
if [条件]
then
执行语句
elif [条件]
then
执行语句
else
执行语句
fi
b. case语句
- 语法形式:
case str in
str1 | str2)
statements;;
str3 | str4)
statements;;
*)
statements;;
esac
这里要注意的是:
当字符串和某个值相同时执行后面的语句;
当同一个操作有多个值时,用分隔符“|”将各个值分开;
双引号作为该条件的执行结束标志;
最后一个条件必须为*,代表其他条件。
示例代码:
执行结果:
c. break和continue
break——立即终止当前循环的执行;
语法:break [n] —— n表示跳出几层循环,默认为1。
continue——立即开始下一个循环的执行;
语法:continue [n] —— n表示从包含continue的最内层循环往外跳到第几层循环,默认为1。
5. 学会在shell程序中使用函数
函数语法格式:
- 语法格式1:
函数名() {
语句
}
- 语法格式2:
函数名()
{
语句
}
- 语法格式3:
function 函数名()
{
语句
}
示例代码:
执行结果:
三、实现第一个shell脚本
进入到linux /home目录下新建一个文件夹shell-test
在这个文件夹下新建一个hello.sh文件
mkdir hello.sh
(1)打开文件
vim hello.sh
(2)编写脚本
#!/bin/bash
#this is the first shell script
echo -e "\t Hello! \n This is the first!!"
“#”标识注释行,但是#!/bin/bash不是注释的意思,而是声明这是用bash运行
(3)脚本执行
赋予执行权限,直接运行
chmod 755 hello.sh
./hello.sh
通过Bash调用执行脚本
bash hello.sh