2019独角兽企业重金招聘Python工程师标准>>>

1、有一台阿里云的机器,接到反映说服务器的磁盘 io 很高,登录服务器查看,并没有发现问题,怀疑是间歇性的,看到造成磁盘 io 高的是mysql,去 show  processlist,准备考虑些个脚本, 5s 秒检测一次磁盘 io(即是检测5次,然后求平均值) ,但 io 大于 70 时,则登录mysql去查询 show proceslist 并记录 /tmp/mysq_processlist.log;

安装 isstat 命令:   yum   install  -y    sysstat

分析:1):磁盘磁盘 io 的命令, 可以用 iostat -xd 1 5 (1分钟一次,打印5次),  注意看%util 这一列; 加上 -d 选项,表示只查看磁盘device,默认会显示CPU的;

[root@localhost_002 shell100]# iostat -xd 1 6|grep sda|tail -n5|awk '{print $NF}' #过滤最后一列
8.72
0.00
0.00
0.00
0.00
[root@localhost_002 shell100]# iostat -xd 1 6|grep sda|tail -n5|awk '{print $NF}'|cut -d . -f1
0
0
0
0
0
[root@localhost_002 shell100]# iostat -xd 1 6|grep sda|tail -n5|awk '{print $NF}'|cut -d . -f1|xargs|sed 's/ /+/g'|bc
0

注释:iostat -x 1 6 第一次的值不准(忽略),用 tail -n5 过滤取后面的 5次,最后一列%util,使用 awk '{print $NF}'来取出来,默认保留两位小数,只去整数部分 cut -d .  -f1,用 xargs 把多列变成一行,然后用sed 's/ /+/g' 把空格替换成 + 号,最终用 bc 来求和;

2):那么如何查看mysql 的内容:        mysql  -uroot  -pnihao123!   -e  "show list  processlist"

[root@localhost_002 shell100]# mysql -uroot -pnihao123! -e "show processlist"
Warning: Using a password on the command line interface can be insecure.
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host      | db   | Command | Time | State | Info             |
+----+------+-----------+------+---------+------+-------+------------------+
| 16 | root | localhost | NULL | Query   |    0 | init  | show processlist |
+----+------+-----------+------+---------+------+-------+------------------+

如上:会显示 warning 警告信息,其实也没有多大关系,看着很不爽,也可以去掉的;    mysql_config_editor  set  --user=root --password

[root@localhost_002 ~]# mysql_config_editor set --user=root --password
Enter password:
[root@localhost_002 ~]# ls -ld .mylogin.cnf
-rw------- 1 root root 100 1月  21 14:48 .mylogin.cnf

然后在当前目录下会生成一个文件 mylogin.cnf,然后再次执行时则mysql 后面跟要执行的命令即可;不会出现警告信息;

[root@localhost_002 ~]# mysql -e "show full processlist"
+----+------+-----------+------+---------+------+-------+-----------------------+
| Id | User | Host      | db   | Command | Time | State | Info                  |
+----+------+-----------+------+---------+------+-------+-----------------------+
| 17 | root | localhost | NULL | Query   |    0 | init  | show full processlist |
+----+------+-----------+------+---------+------+-------+-----------------------+

做实验,我们可以设置成大于 util% 大于 0 则写入 /tmp/mysql_processlist.log里;

[root@localhost_002 shell100]# cat 81.sh
#!/bin/bash
#这个脚本用来检测磁盘io
#日期: 2019-01-24
#作者: yuanhh
if ! iostat &>/dev/null
thenyum install -y sysstat
fi
while :
do sum=`iostat -xd 1 6|grep sda|tail -n5|awk '{print $NF}'|cut -d . -f1|xargs|sed 's# #+#g'|bc`b=$[$sum/5]if [ $b -ge 0 ]thenecho "`date` util% is $b" >>/tmp/mysql_processlist.logmysql -uroot -pnihao123! -e "show full processlist" >>/tmp/mysql_processlist.logfi
sleep 5
done
#执行脚本:
[root@localhost_002 shell100]# sh 81.sh
#查看脚本下的文件:
[root@localhost_002 shell100]# cat /tmp/mysql_processlist.log
2019年 01月 24日 星期四 12:29:42 CST util% is 0
Id  User    Host    db  Command Time    State   Info
11  root    localhost   NULL    Query   0   init    show full processlist
2019年 01月 24日 星期四 12:29:52 CST util% is 0
Id  User    Host    db  Command Time    State   Info
12  root    localhost   NULL    Query   0   init    show full processlist
2019年 01月 24日 星期四 12:30:02 CST util% is 0
Id  User    Host    db  Command Time    State   Info
13  root    localhost   NULL    Query   0   init    show full processlist

注释:如上脚本内容输入,每行会输入 util% 及mysql 下show processlist 的内容;

a=`echo "scale=2;$sum/5"`|bc   这个命令会取平均值,并保留两位小数;

2、写一个截取tomcat catalina.out日志的脚本 tomcat实例t1-t4

# find  /opt/TOM/   -name  catalina.out
/opt/TOM/t1/logs/catalina.out
/opt/TOM/t3/logs/catalina.out
/opt/TOM/t4/logs/catalina.out
/opt/TOM/t2/logs/catalina.out
  1. 这个脚本可以取tomcat实例t1-t4的日志
  2. 这个脚本可以自定义取日志的起始点 ,比如取今天早上10点之后到现在的数据
  3. 这个脚本可以自定义取日志的起始点和终点,比如取今天早上9点到晚上8点的数据 catalina.out 日志内容
Oct 29, 2018 01:52:24 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
Oct 29, 2018 01:52:24 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
Oct 29, 2018 01:52:24 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 2102 ms

参考答案

#!/bin/bash
#这个脚本用来查看Tomcat日志
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-12LANG=en
logfile="/opt/TOM/$1/logs/catalina.out"#将当天的英文月、数字日期、数字年作为变量赋值给d_mdy
d_mdy=`date "+%b %d, %Y"`#判断参数个数
if [ $# -ne 2 ] && [ $# -ne 3 ]
thenecho "你提供的参数个数不对,请提供2个或者3个参数。例:sh $0 t1 08:01:00 14:00:00" exit 1
fi#判断第一个参数是否符合要求
if ! echo $1|grep -qE '^t1$|^t2$|^t3$|^t4$'
thenecho "第一个参数必须是t1、t2、t3或t4"exit 1
fi #判断时间有效性
judge_time()
{date -d "$1" +%s &>/dev/nullif [ $? -ne 0 ]thenecho "你提供的时间$1格式不正确"exit 1fi
}#将24小时制时间转换为12小时
tr_24_12()
{date -d "$1" +%r
}#判断提供的时间点是否在日志中出现
judge_time_in_log()
{if ! grep -q "$d_mdy $(tr_24_12 $1)" $logfilethenecho "你提供的时间$1在日志$logfile中不曾出现,请换一个时间点"exit 1fi
}#判断第2个参数是否合法
judge_time $2#判断起始时间点是否出现在日志里
judge_time_in_log $2#如果提供第3个参数
if [ $# -eq 3 ]
then#判断第3个参数是否合法judge_time $3#判断起始时间是否早于结束时间t1=`date -d "$2" +%s`t2=`date -d "$3" +%s`if [ $t2 -lt $t1 ]thenecho "你提供的时间$2比$3要晚,应该把早的时间放到前面"exitfi#判断提供的结束时间点是否出现在日志中judge_time_in_log $3
fi#取起始时间所在行行号
begin_n=`grep -n "$d_mdy $(tr_24_12 $2)" $logfile|head -1|awk -F ':' '{print $1}'`#取结束时间所在行行号,并用sed截取日志内容
if [ $# -eq 3 ]
thenn=`grep -n "$d_mdy $(tr_24_12 $3)" $logfile|tail -1|awk -F ':' '{print $1}'`#结束日期所在行的下一行才是日志的内容end_n=$[$n+1]sed -n "$begin_n,$end_n"p $logfile
elsesed -n "$begin_n,$"p $logfile
fi

3、让用户输入多个城市的名字(可以是中文),要求不少于 5 个,然后把这些城市存到一个数组里,最后用 for 把它们打印处理;分析如下:

首先用户交互:用到 read -p:

判断用户输入个数是否符合要求;  if 判断

赋值数组的方式:  a=(1 2 3 4 5)                   echo ${a[@]}       =====     echo  ${a[*]}

[root@localhost_002 shell100]# a=(1 2 3 4 5)
[root@localhost_002 shell100]# echo ${a[@]}
1 2 3 4 5
[root@localhost_002 shell100]# echo ${a[*]}
1 2 3 4 5

接下来先写脚本:脚本内容如下:

[root@localhost_002 shell100]# cat 83.sh
#!/bin/bash
#这个脚本用来打印城市名字
#日期: 2019-01-24
#作者: yuanhh
read -p "请输入城市名字: " city
n=`echo $city|awk '{print NF}'`
if [ $n -lt 5 ]
thenecho "请重新输入城市个数;"exit
fi
name=($city)
for i in `seq 0 $[${#name[@]-1}]`
do echo ${name[$i]}
done
#执行脚本:
[root@localhost_002 shell100]# sh 83.sh
请输入城市名字: beijing shanghai nanjing shanxi guangdong
beijing
shanghai
nanjing
shanxi
guangdong

注释:如上,用户脚本输入:使用 read  -p  "请输入城市名字 :" city  把值赋予变量 city;

根据要求判断名字不能少于 5 个, 用awk '{print NF}' 则可以,表示打印列数,   awk的常用选项:  NR(行)          NF(列)

如果是 awk  '{print $NF}' 则表示打印最后一列的内容;                 awk  '{print   NF}'          则表示总共的列数;

如果是awk  '{print $NR}' 则表示打印第一行的内容;                  awk  '{print   NR}'          则表示总共的行数;

[root@localhost_002 shell100]# cat 222.txt
aaa   bbb  ccc
ddd   eee  fff
[root@localhost_002 shell100]# awk '{print $NF}' 222.txt
ccc
fff
[root@localhost_002 shell100]# awk '{print NF}' 222.txt
3
3
[root@localhost_002 shell100]# awk '{print $NR}' 222.txt
aaa
eee
[root@localhost_002 shell100]# awk '{print NR}' 222.txt
1
2

然后用if 判断输入的列数是否小于,如果是,则告示用户并退出此脚本;

下面需要把这个city变量存放在到数组里;因为city 这个变量是个字符串,赋值方法特殊,怎么做呢?     name=($city)    echo  ${name[@]}

首先需要把city变量赋予数组name,然后在使用  echo ${name[@]}  来打印;

[root@localhost_002 shell100]# city='beijing shanghai guangdong  nanjing shanxi'   #赋个变量city
[root@localhost_002 shell100]# echo $city            #打印一下city变量
beijing shanghai guangdong nanjing shanxi
[root@localhost_002 shell100]# name=($city)          #把这个变量赋予数组name
[root@localhost_002 shell100]# echo ${city[@]}       #打印这个数组
beijing shanghai guangdong nanjing shanxi
[root@localhost_002 shell100]# echo ${city[*]}       #打印这个数组,方法同上一样
beijing shanghai guangdong nanjing shanxi

按照要求:下面需要用 for 循环把数组的内容打印出来;可以用for 来遍历这个数组个数;然后分别打印每个位的内容;默认是从 0 开始的;

查看数组个数:  echo  ${#name[@]}

查看数组位数:  echo ${name[0]}   echo ${name[1]}    0 表第一位,以此类推,所以原来第五位 是第四位;

[root@localhost_002 shell100]# echo ${#name[@]}           #打印数组位数;
5
[root@localhost_002 shell100]# echo ${name[0]}            #打印数组的第一位;
beijing
[root@localhost_002 shell100]# echo ${name[1]}
shanghai
[root@localhost_002 shell100]# echo ${name[4]}            #打印数组的第五位;
shanxi
[root@localhost_002 shell100]# echo ${name[5]}            #所以只有五位了;

然后用for 来循环位数依次打印每一位;    for   i  in  `seq 0  $[${#name}-1]`;do   echo ${name[$i]};done

4、有一个业务,有3台服务器(A B C)做了负载均衡,由于规模台下目前未使用自动化运维工具,有新的需求时,开发同事会把变更代码上传到其中一台服务器A上,但是其他2台服务器也需要做相同变更;需要写一个脚本,把A上的代码同步到B和C上;要考虑到不需要同步的目录(upload  logs  info.php)

分析:同步的需求的话,可以rsync服务或者使用 expect 分发脚本的命令;不过不需要使用交互,则没必要用expect 脚本;

而 rsync 远程同步有两种方式:

1):一种是通过ssh同步,需要做秘钥验证,这样登录时才不需要输入密码;方便但是不安全;

2):另一个是通 rsync 服务同步;需要在 B 和 C 上配置rsync 服务端服务,让那些来连接,通过推的方式来做;虽然繁琐,但是安全;

本次通过第一种方式来,首先需要配置秘钥验证,让 A 分别拥有 B 和 C 的公钥,并且免密码登录

然后定义好要同步的网站目录:  dir=/data/wwwroot/111.com

[root@localhost_002 111.com]# pwd
/data/wwwroot/111.com
[root@localhost_002 111.com]# ls
123.php  admin.php  image  index.php  info.php  logs  upload

定义 B 和 C 的 IP 地址:      B_IP=192.168.149.131                            C_IP=192.168.149.133

然后 rsync 命令来写成一个 rs(){         }  的函数;  注意用  --exclude="logs"   --exclude="tmp"  --exclude="upload"   --exelude="caches"来过滤;

然后写一个 read  -p 交互的方式,由用户判断是否选择同步;  read  -p " please input   y/n:  " c

那么用户如何判断呢,通过 case  $c in  判断是  yes  或者  no  或者  exit  则运行对应的命令;

脚本命令如下

在rs(){ }里面#上函数中$1表示函数的第一个参数,即下面的IP地址;
  在shell中# \ 这个斜杠表示换行符;用在shell命令下,相当于把换行脱义了,就不是换行了,比如有时候觉得一条命令很长,为了规范美观,则可以把一条命令放在多行来执行,就可以用 \ 这个符号来分割;

如下命令:它的结果还是会打印  ls  /tmp/下的内容; 等于把一条命令多行来写

[root@localhost_002 shell100]# cat 111.sh
#!/bin/bash
ls \
/tmp/
[root@localhost_002 shell100]# sh 111.sh
#127.0.0.1.diff      curl.err   

换行符: 还有 \n, 只有  echo -e 是才用到 -n;

[root@localhost_002 shell100]# echo -e "123\n456"
123
456
# \ 的用法:
[root@localhost_002 shell100]# echo "12 \
> 34"
12 34

脚本如下:

[root@localhost_002 shell100]# cat 84.1.sh
#!/bin/bash
#这个脚本用来rsync 代码上线
#日期: 2019-01-24
#作者: yuanhh
dir=/data/wwwroot/111.com
B_IP=192.168.149.131
#C_IP=192.168.149.132
rs(){rsync -azP -e 'ssh -p 56888' \--exclude="logs" \--exclude="upload" \--exclude="info.php" $dir $1:$dir
}
#上函数中$1表示函数的第一个参数,即下面的IP地址;
# \ 这个斜杠表示换行符;
read -p "该脚本将会把本机$dir下的文件同步到$B_IP和$C_IP上,是否要继续? y|n ": c
case $c in y|n)rs $B_IP#  rs $C_IP;;n|N)exit;;*)echo "请输入y or  n;";;
esac
#执行脚本:
[root@localhost_002 shell100]# sh 84.1.sh
该脚本将会把本机/data/wwwroot/111.com下的文件同步到192.168.149.131和上,是否要继续? y|n :y
sending incremental file list
111.com/
111.com/123.php21 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=4/6)
111.com/admin.php12 100%   11.72kB/s    0:00:00 (xfr#2, to-chk=3/6)
111.com/index.php17 100%   16.60kB/s    0:00:00 (xfr#3, to-chk=2/6)
111.com/image/
111.com/image/kaola.jpg780,831 100%    2.59MB/s    0:00:00 (xfr#4, to-chk=0/6)

此时同步完成:可以去 rs_B (192.168.149.131)这台机器上查看 目录是同步过来;   /data/wwwroot/111.com

[root@localhost_03 ~]# ls /data/wwwroot/111.com/111.com/
123.php  admin.php  image  index.php

此时发现在 rs_B 机器上同步过来了文件;此脚本完成;

5、需要统计网站并发量(1秒内有多少请求);用shell脚本;借助 zabbix 成图;

假设日记路径  /usr/local/nginx/logs/access.log

分析:大概分析一下每分钟的日记内容,假如是1000条;我们要统计的是上一秒内的日记条数;

那么怎么统计上一秒的日记呢;一般日记格式如下:

192.168.149.135 - - [14/Dec/2018:17:30:07 +0800] "GET / HTTP/1.1" 200 640 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"

可以看到日期格式 日期/月份/年份:小时:分钟:秒,那么上一秒也就是减去 1 秒之前的日记条数;        date -d "-1 second"  +%Y:%H:%M:%S

[root@localhost_002 shell100]# date +%d/%b/%T
24/Jan/22:15:09
[root@localhost_002 shell100]# date -d "-1 second" +%d/%b/%T
24/Jan/22:14:38

在本例中,可以用一个 变量 t 来表示;用在后面的过滤;    t=`date -d "-1 second" +%d/%b/%Y%T`

然后用 tail -n1000  $log|grep -c "$t"                         #$log 表示日记路径的变量;

然后 echo $n 打印即可;

[root@localhost_03 111.com]# cat  85.sh
#!/bin/bash
LANG=en
t=`date -d "-1 second" +%d/%b/%Y:%T`
log=/usr/local/nginx/logs/access.logn=`tail -n1000 $log|grep -c "$t"`
echo $n
#执行脚本:
[root@localhost_03 111.com]# sh 85.sh
0

转载于:https://my.oschina.net/yuanhaohao/blog/3005701

day28:检测磁盘io|自定义时段查看tomcat 日记|打印城市名字|代码上线|统计网站并发量...相关推荐

  1. linux进程磁盘io监测,系统性能检测--磁盘io

    先罗列一些工作中用得比较多的系统检测工具吧,top.ps.iostat.vmstat.free (-m).tcpdump... 1.磁盘io相对于内存读写是巨慢无比的,数据库操作也是,所以在一些io密 ...

  2. Linux下使用iotop检测磁盘io使用情况

    介绍 Linux下的IO统计工具如iostat, nmon等大多数是只能统计到per设备的读写情况, 如果你想知道每个进程是如何使用IO的就比较麻烦. iotop 是一个用来监视磁盘 I/O 使用状况 ...

  3. pidstat_Linux查看某个进程的磁盘IO读写情况 pidstat

    一.现象 1)钉钉告警不断,告警如下CPU使用达到100% 普罗米修斯监控 2)查看数据库,没有发现比平时同一时段,业务量的增加.但是,数据库显示latch free等告警,验证了CPU使用过高导致. ...

  4. linux snmp磁盘io,cacti利用snmpdiskio 监控服务器磁盘

    此文主要讲述了cacti利用snmpdiskio 监控服务器磁盘 IO的方法,cacti的安装这里不再累述 环境 cacti-0.8.7g snmpdiskio-0.9.6 安装步骤 监控机上操作: ...

  5. linux查看硬盘smart_Linux检测磁盘坏道工具用什么命令

    请关注本头条号,每天坚持更新原创干货技术文章. 如需学习视频,请在微信搜索公众号"智传网优"直接开始自助视频学习 1. badblock命令简介 badblock命令用于查找磁盘中 ...

  6. linux+平均磁盘请求数量_Linux 查看磁盘IO并找出占用IO读写很高的进程

    背景-线上告警 线上一台服务器告警,磁盘利用率 disk.util > 90,并持续告警. 登录该服务器后通过 iostat -x 1 10 查看了相关磁盘使用信息.相关截图如下: # 如果没有 ...

  7. Linux查看哪些进程占用较多的cpu、内存和磁盘IO的方法

    linux 查看哪个进程占用CPU和内存 1.ps aux | grep mysql 用这个方法找到进程号 如下:找到mysql的进程号是1651 [root@vm254 ~]# ps aux |gr ...

  8. Linux统计进程网络,查看磁盘io、内存free、系统进程ps、网络状态netstat、Linux抓包tcpdump...

    查看磁盘io性能状态 iostat -x 查看磁盘使用(安装包与sar的安装包一起) 主要查看%util [root@shu-test ~]# iostat -x Linux 3.10.0-693.e ...

  9. linux查看磁盘io性能

    1. 查看磁盘 IO 性能 1.1 top 命令 top 命令通过查看 CPU 的 wa% 值来判断当前磁盘 IO 性能,如果这个数值过大,很可能是磁盘 IO 太高了,当然也可能是其他原因,例如网络 ...

最新文章

  1. python主要学哪些课程_Python学习课程大纲自学Python参考
  2. 李宏毅线性代数笔记9:对角化
  3. Python 的运算符
  4. Webshell免杀绕过waf
  5. 奇怪吸引子---NoseHoover
  6. matlab循环数组里的数据库,用于在matlab的python中循环数组
  7. TensorFlow Lite支持设备内置会话建模
  8. Linux 环境下FC(SAN)磁盘在线删除
  9. Sql Server 2005各大版本区别与下载
  10. Java依旧排名第一,然而变化几何?
  11. 异常为当IDENTITY_INSERT设置为OFF时 解决办法
  12. 【Turbo】基于MATLAB的turbo编译码算法的仿真
  13. jdbc odbc连接mysql_具体说明JDBC连接数据库与ODBC连接数据的区别
  14. cmd find 命令 多个 或者 关系 +windows_使用 rush 进行命令并行处理
  15. 禁止苹果浏览器Safari将数字识别成电话号码的方法
  16. 新Word文档借用旧文档的部分样式
  17. 我的世界Mod整合包中的Mod下载
  18. 云集宣布品牌升级,推出全新slogan“购物享受批发价”
  19. 这么炫酷的轮播图·你想学吗?
  20. sinon.js基础使用教程---单元测试

热门文章

  1. boost::interprocess::anonymous_shared_memory用法的测试程序
  2. VTK:小部件之BorderWidget
  3. VTK:结构化网格之GetLinearPointId
  4. OpenCV平滑图像Smoothing Images
  5. OpenGL polygonsmooth多边形平滑的实例
  6. QML基础类型之vector4d
  7. c++类与类的关联(Association)关系
  8. 经典C语言程序100例之八一
  9. 经典C语言程序100例之十二
  10. 经典C语言程序100例之二