我错别字比较多,可能有些地方出现错误,那都是输入发的锅,聪明的你,猜一猜就知道上下文什么意思了,嘿嘿
shell脚本是个实现linux 系统及运维自动化管理的重要且必备的工具
1.首先需要熟练使用vi/vim编辑器的是使用,我们还需要ssh终端配置及.vimrc 的配置,这样我们的vim功能就会变得强大
2.linux 常用的150个常用的命令
4.常见的lnux 网络服务部署,及优化排错crond ,nfs,rsync,inotify,lanmp,sersync,ssh,Memcached
什么是shell ,shell是命令解释器,他在操作系统的最底层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,这种对话方式是交互式(及从输入命令,既可以得到shell的回应),或者非交互(执行脚本程序)的方式
python 语言介绍,和shell差不多,大家可以对照参考
一个清除日志的脚本
#!/bin/bash
#清除日志脚本
LOG_DIR=/var/log #定义变量,用来存储要清楚的路径下的日志
ROOT_UID=0 # $UID是0的时候,表示用户具有root权限
#要使用root用户来运行脚本,其中-ne表示不等于,-gt表示大于,-lt小于,-eq等于,-ge大于等于,-le小于等于 ,linux 中逻辑与 -a 逻辑或 -o
if[ "$UID" -ne "$ROOT_UID" ]
then
echo "Must be root to run this script"
exit 1
fi
# 首先进入对应的目录,如果目录不存在就提示
# 这里用|| 逻辑与运算,我们可以如果目录存在 ,后面的报错就不会执行,如果不存在,就会报错
cd $LOG_DIR || {
echo "Cannot change to necessary directory." >&2 # 这里的是将输出的信息 输出到标准错误输出流中
exit 1
}
cat /dev/null > message && echo "Logs cleaned up." #清理成功打印输出日志
# message 是路径下的文件 ,我们用/dev/null 来清空内容
#/dev/null 还可以将一些非标准的 输入流 写入到 /dev/null ,这样来可以屏蔽掉我们想展示的东西
exit 0
#退出之前返回0表示成功,返回1表示失败
(补充一个命令:我们在 启动一些软件时,通常是交互式的,我们想后台启动,我们可以在 启动命令 后面 输入 空格&)
当然我们清除日志的命令(应用场景,保留文件,清空内容)
echo >test.log 或者>test.log 或者cat /dev/null > test.log
shell 脚本擅长处理纯文本类型的数据,而linux系统中几乎所有的配置文件,文件(如nfs,rsync,httpd,nginx,lvs等)多数启动文件都是纯文本类型的文件
shell在运维中的作用
shell 脚本语言是弱类型语言,比较通用的有shell标准Bourne shell (sh)和 C shell(csh),其中Bourne shell(sh)已经被
bash shell 取代
查看当前系统支持的shell 类型,命令是:cat /etc/shells
其中前三个我们比较常用,bash 比sh功能强大
文件测试表达式(我们操作问价前,要判断文件是否存在)文件命令的 参数详解
如果我们忘记上述参数有什么用,我们可以用man test 命令查看,不停的回车,直到出现end ,我们man test 命令可以看很多比比较的 命令的用法
比如我当前目录下有一个1.sh 文件,我看看是否是可执行文件,如果是输出为1,不是输出为0
值得注意的是我们 给一个变量名赋值问系统文件的路径, 我们判断的是文件,不是判断的字符串
(这里提一下linux 命令中声明变量的问题:
变量名=变量值 , 注意=左右不能有空格,使用$变量名调用变量
使用set命令可以查看所有变量,包括普通变量和环境变量,删除变量名:使用unset变量名即可
)
我们接下来创建一个脚本,写一个测试
输入 ,这里$1 表示我们执行脚本的第一个参数 ,后面的大括号 中的命令是要给整体,
然后我们测试(如果测试脚本没有成功,记得看是不是 脚本没有执行的权限,添加执行权限)
常用的字符串后面参数详解
字符串不为0
整数比较的 常用的命令
如果我们要[] 中使用> 表示大于 我们要用转义符,< 同理
练习两个整数比较大小,用三种方法,1脚本传参,2 用read 方法, 3 定义变量的方式
#!/bin/sh
#传参的方式,如果传入的参数不等与两个
[ $# -ne 2 ]&& {
echo "USAGE:num1 num2"
exit 1
}
#然后判断两个数是否是整数
[ "`echo "$1"|sed -r 's#[^0-9]##g'`" = "$1" ] || {
echo "first arg must be int."
exit 2
}
[ "`echo "$2"|sed -r 's#[^0-9]##g'`" = "$2" ] || {
echo "first arg must be int."
exit 2
}
[ $1 -lt $2 ] && {
echo "$1 < $2"
exit 0
}
[ $1 -eq $2 ] && {
echo "$1 = $2"
exit 0
}
[ $1 -gt $2 ] && {
echo "$1 < $2"
exit 0
}
sed 命令 参考这个 博客https://www.cnblogs.com/wangqiguo/p/6718512.html
sed命令实例:判断是否是 是整数
这个命令的作用是: 判断是否全是数字,如果不是则输出为0,是输出为1 ,sed 是一个流编辑器,利用正则,将输入的123中非数字的替换为空,这样 与原来的比较如果相同就是 输入的是整数
用read方法来读取判断你是否输入的是整数
#!/bin/sh
read -p "pls input two num:" num1 num2
#传参的方式,如果传入的参数不等与两个
[ $# -ne 2 ]&& {
echo "USAGE:num1 num2"
exit 1
}
#然后判断两个数是否是整数
[ "`echo "$1"|sed -r 's#[^0-9]##g'`" = "$1" ] || {
echo "first arg must be int."
exit 2
}
[ "`echo "$2"|sed -r 's#[^0-9]##g'`" = "$2" ] || {
echo "first arg must be int."
exit 2
}
[ $1 -lt $2 ] && {
echo "$1 < $2"
exit 0
}
[ $1 -eq $2 ] && {
echo "$1 = $2"
exit 0
}
[ $1 -gt $2 ] && {
echo "$1 < $2"
exit 0
}
(插播一个命令:我们在vim 下,想用替换 在命令模式下 输入 :%#原字符串#新字符串#g ,就可以将所有的字符都替换掉)
read 的方式去判断
#!/bin/sh
2 read -p "pls input two num:" num1 num2
3 a=$num1
4 b=$num2
5
6 [ -z "$a" -o -z "$b" ] && {
7 echo "USAGE: num1 num2"
8 exit 1
9 }
10 #传参的方式,如果传入的参数不等与两个
11
12
13 #然后判断两个数是否是整数
14 [ "`echo "$a"|sed -r 's#[^0-9]##g'`" = "$a" ] || {
15 echo "first arg must be int."
16 exit 2
17 }
18
19 [ "`echo "$b"|sed -r 's#[^0-9]##g'`" = "$b" ] || {
20 echo "first arg must be int."
21 exit 2
22 }
23
24 [ $a -lt $b ] && {
25 echo "$a < $b"
26 exit 0
27 }
28
29 [ $a -eq $b ] && {
30 echo "$a = $b"
31 exit 0
32 }
33
34 [ $a -gt $b ] && {
35 echo "$a < $b"
36 exit 0
37 }
菜
单的脚本,根据输入的参数打印出不同的结果:
#!/bin/sh
menu() {
cat <
用shell脚本判断你系统剩余内存的大小,如果内存低于100M就邮件报警给管理员,并且加入系统定时任务,每三分钟执行一次
首先先写一个发邮件的脚本(发送邮件,首先你要获得root权限,详细看https://blog.csdn.net/zh314js/article/details/76038868)
#!/bin/sh
2 cur_free=`free -m|grep buffers\/|awk '{print $NF}'` #nf输出分割的最后一段
3 chars="current memory is $cur_free."
4 echo "$cur_free"
5 if [ $cur_free -lt 100 ] #当内存小于100M
6 then
7 echo "现在的内存是:$cur_free"| mail -s "$chars" [email protected] #现在内存是$cur_free是 邮件的内容, -s 后面是邮件的title
8 fi
9
~
我们假设这个脚本名称是memorymontor.sh
然后我们执行定时任务
crontab -l
*/3 * * * * memorymontor.sh >/dev/null 2>$1 #每三分钟执行一次,脚本,标准输入丢弃,错误输出流 重新定向到了标准输出,而标准输出 丢弃了,所以标准输入输出都丢弃了
监控web服务是否正常和监控db服务是否正常,不低于5中思路
共同的方法有:
利用端口
1、本地的用命令:netstat /ss/lsof (比如netstat -lnp|grep 端口号,ss -lnp | grep 端口 ,lsof -i:端口)
远程的命令:telnet/nmap/nc
ss命令(参考博客http://www.cnblogs.com/sparkdev/p/8421897.html)
2、利用进程(本地)ps -ef | prep 端口或对应的程序
============
3、利用wget/curl(http方式,判断根据返回值或者返回的内容,有时候进程存在,但是防火墙挡住了,也有问题)
4、header(http),(http方式,根据状态码判断)
5、数据库特有,通过mysql客户端连接,根据返回值或者返回的内容进行判断
用三种方法,监控db服务是否开启
#!/bin/sh
#判断mysql服务是否开启的常用几种等价的方法
if [ "`netstat -lnt | grep 3306 |awk -F "[ :]" '{print $4}'`" = "3306" ]
# if [ `netstat -lnt |grep 3306 |awk -F "[ :]+" '{print $4}'` -eq 3306 ] 是错误的,因为由于当没有启动mysql ,就成了null 与 3306比较,报错,用= 是因为用了双引号,是两个字符串之间的比较
#if [ `ps -ef | grep mysql | grep -v grep |wc -l' -gt 0 ]
#这里的ip 是数据库的服务器ip
#if [ `nc -w 2 10.0.0.7 3306 &>/dev/null&&echo ok |wc -l` -gt 0 ] #nc用于看是否看防了对应的端口
#if [ `namp 10.0.0.7 -p 3306 2>/dev/null|grep open|wc -l` -gt 0 ] ##!/bin/sh
#判断mysql服务是否开启的常用几种等价的方法
if [ "`netstat -lnt | grep 3306 |awk -F "[ :]" '{print $4}'`" = "3306" ]
# if [ `netstat -lnt |grep 3306 |awk -F "[ :]+" '{print $4}'` -eq 3306 ] 是错误的,因为由于当没有启动mysql ,就成了null 与 3306比较,报错,用= 是因为用了双引号,是两个字符串之间的比较
#if [ `ps -ef | grep mysql | grep -v grep |wc -l' -gt 0 ]
#这里的ip 是数据库的服务器ip
#if [ `nc -w 2 10.0.0.7 3306 &>/dev/null&&echo ok |wc -l` -gt 0 ] #nc用于看是否开放了对应的端口
#if [ `namp 10.0.0.7 -p 3306 2>/dev/null|grep open|wc -l` -gt 0 ]
#if[ `lsof -i tcp:3306|wc -l` -gt 0 ]
then
echo "MYSQL is Running"
else
echo "MYSQL is Stopped"
fi
#if[ `lsof -i tcp:3306|wc -l` -gt 0 ]
then
echo "MYSQL is Running"
else
echo "MYSQL is Stopped"
fi
!/bin/sh
if [ `curl -I http://10.0.0.52 2>/dev/null