1、/var/log/messages是Linux下重要的日志文件
清空日志及文件内容的三种方法:
(1) # cat /dev/null > /var/log/messages
(2) # echo > test.log
(3) # > test.log
2、shell在运维工作中的地位
shell脚本适合处理大量纯文本文件,多数启动文件都是纯文本类型的文件,可以运用到配置文件、日志文件的处理
3、shell种类:在UNIX/LINUX中主要有两大类Shell
(1) Bourne shell : 包括bash、ksh、sh,目前已被Bash shell(目前主流)取代
(2) C shell : 包括csh、tcsh
注:查看Linux支持的shell: #cat /etc/shells
4、文件测试表达式
常用文件测试操作符号 | 说明 |
---|---|
-f 文件,英文file | 文件存在且为普通文件为真,即测试表达式成立 |
-d 文件,英文directory | 文件存在且为目录时则为真 |
-s 文件,英文size | 文件存在且文件大小不为0即为真 |
-e | 文件存在则为真 |
-r/-w/-x | 判断文件是否可读/可写/可执行 |
file1 -ef file2 | 判断两个文件是否是统一设备文件或硬链接 |
file1 -L file2 判断两个文件是否是同意文件的软链接
忘记之后查找:man test
实践:
(1)[ -f filename ]&&echo 1 || echo 0 #判断文件是否存在,存在1,不在0;
(2)file = /root/order 设置变量
#[ -f $file ]&&echo 1||echo 0 判断变量对应的是否是文件
方法:高效文件判断
(1)|| :前面不满足才执行后面
# [ -f filename ]||echo 1
(2) && :前面满足执行后面
# [ $1 -eq 3 ] && {
echo 1;
echo 2;
echo 3;
}
注:学习Shell脚本编程多看系统服务配置文件脚本
5、字符串表达式
查看:man test 查看下方STRING部分
常用字符串测试操作符 | 说明 |
---|---|
-z “字符串” | 若字串长度为0则真,z:zero |
-n “字符串” | 若字串长度不为0则真,no zero |
“串1” == “串2” | 两字串相等为真(==/= 均可) |
“串1” != “串2” | 若两字串不等则真 |
注:1、以上表格中的字串必须用 ” “引起来
2、比较符号的两端必须有空格
实战:
(1) [ -z "abc" ]&&echo 1||echo 0
[ ! -z "abc" ] 注:在测试[]中加 !号意为取反,相当于 -n
(2) 定义变量:test="abc"
# [ -z $test ]&&echo 1||echo 0
# [ "$test" = "abc" ] 注意:$ 取变量值 ,在字串比较是也需加" "
(3)[ -z $test ]&& test="abc" #判断test是否长度为0,是的话为变量赋值
另附:linux学习就是字符串的处理
6、Shell整数比较
操作符 | 说明 |
---|---|
-eq (==或=) | 相等 |
-ne (!=) | 不等于 not equal |
-gt (>) | 大于 greater than |
-ge (>=) | 大于等于 |
-lt(<) | 小于 less than |
-le(<=) | 小于等于 |
实战:
(1)[ 2 -eq 1 ]&&echo 1||echo 0
(2)[ 2 \> 1 ]&&echo 1||echo 0 单括号用运算符需转义
若不想转义用双[] 如:[[ 2 > 1 ]]&&echo 1||echo 0
注:1、整数加引号比较也是对的
2、[]用比较符需要转义 >,若不想转义需用[[ ]];
3、工作中用-eq等字符代替,避免是用比较符,可以规避问题
7、逻辑操作符
在[]和test中使用的逻辑操作符 | 在[[]]中使用的操作符 | 说明 |
---|---|---|
-a | && | and与,两端都真,才真 |
-o | || | or或,一端真就真 |
! | ! | not非,相反则真 |
注:这些符号必须在使用中记忆
实战:
(1)file1=/root/aaa;file2=/root/bbb
# [ -f $file1 -a -f $file2 ]&&echo 1||echo 0 或
# [ -f $file1 && -f $file2 ]&&echo 1||echo 0
(2) # [ -f $file1 -o -f $file2 ]&&echo 1||echo 0 或
# [ -f $file1 || -f $file2 ]&&echo 1||echo 0
8、综合案列
开发shell脚本分别实现定义变量,脚本传参以及read读入的方式比较两个整数大小,并用条件语句进行判断并以屏幕输出的方式提示用户比较结果。
注:开发三个脚本,当用脚本传参以及read读入的方式需要对变量是否是数字、并且传参个数不对予以提示
read命令:Linux中提示输入的语句
(1) c1.sh
#!/bin/bash
read -p "please input two num:" num1 num2
a=$num1
b=$num2
#判断个数
[ -z "$a" -0 -z "$b" ]&&{
echo "usage:num not eq 2"
exit 1 #退出
}
#判断是否是整数
[ "`echo "$a"|sed -r 's#[^0-9]##g'`" = "$a" ] ||{
echo "first num must be int"
exit 2
}
[ "`echo "$b"|sed -r 's#[^0-9]##g'`" = "$b" ] ||{
echo "secord num must be int"
exit 2
}
#两整数比较
[ $a -lt $b ] &&{
echo "$a < $b"
exit 0
}
[ $a -eq $b ]&&{
echo "$a = $b"
exit 0
}
[ $a -gt $b ]&&{
echo "$a > $b"
exit 0
}
9、综合案列–打印一级菜单一键安装web服务
#!/bin/bash
menu(){
cat << END
1.[ install lamp ]
2.[ install lnmp ]
3.[ exit ]
pls input the num you want:
END
}
memu0
read num
[ "$num" == 1 ]&&{
echo "start installing lamp"
[ -x /root/lamp.sh ] || exit 2
/root/lamp.sh
exit 0
}
[ "$num" == 2 ]&&{
echo "start installing lnmp"
[ -x /root/lnmp.sh ] || exit 3
/root/lnmp.sh
exit 0
}
[ "num" == 3 ]&&{
echo ""bey."
exit 0
}
echo "input error"
exit 0
分支与循环结构
1、if 条件语句
(1) 单分支结构
if [ 条件 ]
then
指令
fi
或
if [ 条件 ];then
指令
fi
(2)双分支结构
if [ 条件 ]
then
指令集1
else
指令集2
fi
(3)多分支结构
if [ 条件1 ]
then
指令集1
elif [ 条件2 ]
then
指令2
else
指令3
fi
2、案列实践
开发一个shell脚本判断系统剩余的内存大小,如果低于100M就报告给管理员,并且加入系统的定时任务每三分钟执行一次检查
第一步:去内存值,并发邮件
Free=`free -m|awk 'NR==3 {print $NF}'`
if [ "$Free" -lt 100 ]
then
mail -s "System space is not sufficient 100MB" >2462108717@qq.com
fi
第二步:设置定时任务
#crontab -l
*/3 * * * * /bin/bash /root/anlie.sh > /dev/null 2>&1
3、监控Web、MySQL的办法
案列:监控MySQL、web
1、根据端口监控
本地监控(同一机器上):netstat、ss、lsof
lsof -i :3306|grep mysql |wc -l
netstat -ntlp|grep 3306(或者mysqld)|wc -l 监控MySQL
netstat -ntlp|grep 80(httpd)|wc -l 监控web
远程监控(不在同一机器上):telnet/nmap/nc
echo -e "\n" | telnet baidu.com 80|grep connected
nnmap www.baidu.com -p 80 | grep open |wc -l (常用,若没有yum 安装)
2、根据进程判断
ps -ef |grep mysql|wc -l
3、监控MySQL的脚本
vim check_db.sh
#!/bin/bash
if [ "netstat -ntlp|grep 3306|awk -F "[ :]+" '{print $5}'" = "3306" ]
# if [ `nmap 10.0.0.7 -p 3306 2>/dev/null|grep open|wc -l` -gt 0 ]
then
echo "MySQL is running"
else
echo "MySQL is stopped"&&{
systemctl start mysqld
systemctl enable mysqld
}
fi
4、监控web的脚本(正确返回中有: HTTP/1.1 200 OK) 200|302|301都是正确的
vim check_web.sh
#!/bin/bash
if [ "curl -s http://10.0.0.7 &>/dev/null &&echo $?" = "0" ]
# if [ `curl -I http://10.0.0.7 > /dev/null|head -1|grep 200|wc -l` -eq 1 ]
then
echo "Httpd is running"
else
echo "Httpd is stopped"&&{
systemctl start httpd
systemctl enable httpd
}
fi