烟台住房和城乡建设局网站,创建wordpress博客,网页特效大全,网站建设注意什么运维实用脚本整理 本文脚本仅供参考运维排查问题思路运维排查问题的方法和命令#xff08;1#xff09;尽可能搞清楚问题的前因后果#xff08;2#xff09;有谁在?#xff08;3#xff09;之前发生了什么?#xff08;4#xff09; 现在在运行的进程是啥?#xff0… 运维实用脚本整理 本文脚本仅供参考运维排查问题思路运维排查问题的方法和命令1尽可能搞清楚问题的前因后果2有谁在?3之前发生了什么?4 现在在运行的进程是啥?5监听的网络服务6CPU 和内存7硬件8 IO 性能(9) 挂载点 和 文件系统(10) 内核、中断和网络(11) 系统日志和内核消息(12) 定时任务(13) 应用系统日志 Linux运维日常巡检脚本系统指标巡检脚本日常命令性能相关的命令进程相关的命令javadump.sh 常用运维加固脚本根据PID过滤进程所有信息根据进程名过滤进程信息 常用工具一键部署安装常用lib库安装系统检查脚本SPN 日常巡查脚本ffmpeg脚本打开进程并判断进程数量关闭进程 java jar包启动-剔除Pom中依赖Java jar包通用启动脚本查看centos配置信息脚本Jenkins项目打包发布脚本注意SQL Server以下脚本目前还不完善(AlwaysOn相关 到 Agent作业备份)AlwaysOn相关节点切换监控节点切换作业控制 SQL Server 邮件脚本Mysql-使用脚本进行分库分表备份数据库-数据备份备份作业数据一致性检查Agent作业备份 监控某个目录是否被更改确保本机能连上shell脚本中指定的smtp服务器的25好端口下面开始测试查看邮件就能看到/data/test目录下变动的文件或子目录信息了通过crontab定时任务每5分钟执行一次检查 日志文件ERROR监控报警1第一类日志2第二类日志3第三类日志 基于Ping和Telnet/NC的监控脚本案例分析通过shell脚本判断172.16.60.0/24网络里当前在线的ip有哪些能ping通则认为在线。案例一单纯地对某些ip进行ping监控案例二对/etc/hosts列表里的ip映射关系进行ping监控报警案例三通过nc工具对/etc/hosts列表里的ip的443端口跟本机通信是否正常进行探测 监控磁盘的监控脚本监控磁盘IO使用率的脚本实时查看IO使用情况防止因为磁盘IO效率低而导致MySQL查询慢的问题 实时监控网卡流量的通用脚本检测网卡流量并按规定格式记录在日志中指定时间内网站访问次数的监控nginx日志监控脚本python报警脚本写个测试脚本不停curl请求资源触发报警定时任务由于上面脚本是监控一分钟内的日志因此每分钟执行一次 网站访问状态和超时时间监控报警设置服务器磁盘监控脚本含报警邮件业务日志清理脚本Linux下间隔多少秒 (即以秒为单位) 去执行某条命令或某个shell脚本的操作方法Linux下批量ping某个网段ip的脚本查看系统运行情况管理dockerShell多线程备份数据库监测 Nginx 访问日志 502 情况并做相应动作检测两台服务器指定目录下的文件一致性定时清空文件内容定时记录文件大小计算文档每行出现的数字个数并计算整个文档的数字总数杀死所有脚本从 FTP 服务器下载文件扫描主机端口状态监控 httpd 的进程数根据监控情况做相应处理iptables 自动屏蔽访问网站频繁的IP1屏蔽每分钟访问超过200的IP2屏蔽每分钟SSH尝试登录超过10次的IP 根据web访问日志封禁请求量异常的IP如IP在半小时后恢复正常则解除封禁判断用户输入的是否为IP地址 本文脚本仅供参考
运维排查问题思路 运维排查问题的方法和命令
遇到服务器故障问题出现的原因很少可以一下就想到。基本上都会从以下步骤入手
1尽可能搞清楚问题的前因后果
不要一下子就扎到服务器前面你需要先搞明白对这台服务器有多少已知的情况还有故障的具体情况。不然你很可能就是在无的放矢。
必须搞清楚的问题有 故障的表现是什么无响应报错 故障是什么时候发现的 故障是否可重现 有没有出现的规律比如每小时出现一次 最后一次对整个平台进行更新的内容是什么代码、服务器等 故障影响的特定用户群是什么样的(已登录的, 退出的, 某个地域的…)? 基础架构物理的、逻辑的的文档是否能找到? 是否有监控平台可用? 比如Munin、Zabbix、 Nagios、 New Relic… 什么都可以 是否有日志可以查看?. 比如Loggly、Airbrake、 Graylog…
最后两个是最方便的信息来源不过别抱太大希望基本上它们都不会有。只能再继续摸索了。
2有谁在? wlast用这两个命令看看都有谁在线有哪些用户访问过。这不是什么关键步骤不过最好别在其他用户正干活的时候来调试系统。有道是一山不容二虎嘛。one cook in the kitchen is enough.
3之前发生了什么?
history查看一下之前服务器上执行过的命令。看一下总是没错的加上前面看的谁登录过的信息应该有点用。另外作为admin要注意不要利用自己的权限去侵犯别人的隐私哦。
到这里先提醒一下等会你可能会需要更新 HISTTIMEFORMAT 环境变量来显示这些命令被执行的时间。对要不然光看到一堆不知道啥时候执行的命令同样会令人抓狂的。
4 现在在运行的进程是啥?
pstree -aps aux这都是查看现有进程的。 ps aux 的结果比较杂乱 pstree -a 的结果比较简单明了可以看到正在运行的进程及相关用户。
5监听的网络服务 netstat -ntlpnetstat -nulpnetstat -nxlp
我一般都分开运行这三个命令不想一下子看到列出一大堆所有的服务。netstat -nalp倒也可以。不过我绝不会用 numeric 选项 鄙人一点浅薄的看法IP 地址看起来更方便。
找到所有正在运行的服务检查它们是否应该运行。查看各个监听端口。在netstat显示的服务列表中的PID 和 ps aux 进程列表中的是一样的。
如果服务器上有好几个Java或者Erlang什么的进程在同时运行能够按PID分别找到每个进程就很重要了。
通常我们建议每台服务器上运行的服务少一点必要时可以增加服务器。如果你看到一台服务器上有三四十个监听端口开着那还是做个记录回头有空的时候清理一下重新组织一下服务器。
6CPU 和内存 free -muptimetophtop
注意以下问题:
还有空余的内存吗? 服务器是否正在内存和硬盘之间进行swap?
还有剩余的CPU吗? 服务器是几核的? 是否有某些CPU核负载过多了?
服务器最大的负载来自什么地方? 平均负载是多少?
7硬件 lspcidmidecodeethtool有很多服务器还是裸机状态可以看一下
找到RAID 卡 (是否带BBU备用电池?)、 CPU、空余的内存插槽。根据这些情况可以大致了解硬件问题的来源和性能改进的办法。
网卡是否设置好? 是否正运行在半双工状态? 速度是10MBps? 有没有 TX/RX 报错?
8 IO 性能 iostat -kx 2vmstat 2 10mpstat 2 10dstat --top-io --top-bio 这些命令对于调试后端性能非常有用。 检查磁盘使用量服务器硬盘是否已满? 是否开启了swap交换模式 (si/so)? CPU被谁占用系统进程? 用户进程? 虚拟机? dstat 是我的最爱。用它可以看到谁在进行 IO 是不是MySQL吃掉了所有的系统资源? 还是你的PHP进程?
(9) 挂载点 和 文件系统 mountcat /etc/fstabvgspvslvsdf -hlsof D / /* beware not to kill your box */一共挂载了多少文件系统? 有没有某个服务专用的文件系统? (比如MySQL?) 文件系统的挂载选项是什么 noatime? default? 有没有文件系统被重新挂载为只读模式了 磁盘空间是否还有剩余? 是否有大文件被删除但没有清空? 如果磁盘空间有问题你是否还有空间来扩展一个分区
(10) 内核、中断和网络 sysctl -a | grep ...cat /proc/interruptscat /proc/net/ip_conntrack /* may take some time on busy servers */netstatss -s 你的中断请求是否是均衡地分配给CPU处理还是会有某个CPU的核因为大量的网络中断请求或者RAID请求而过载了 SWAP交换的设置是什么对于工作站来说swappinness 设为 60 就很好, 不过对于服务器就太糟了你最好永远不要让服务器做SWAP交换不然对磁盘的读写会锁死SWAP进程。 conntrack_max 是否设的足够大能应付你服务器的流量? 在不同状态下(TIME_WAIT, …)TCP连接时间的设置是怎样的 如果要显示所有存在的连接netstat 会比较慢 你可以先用 ss 看一下总体情况。
你还可以看一下 Linux TCP tuning 了解网络性能调优的一些要点。
(11) 系统日志和内核消息 dmesgless /var/log/messagesless /var/log/secureless /var/log/auth查看错误和警告消息比如看看是不是很多关于连接数过多导致 看看是否有硬件错误或文件系统错误? 分析是否能将这些错误事件和前面发现的疑点进行时间上的比对。
(12) 定时任务 ls /etc/cron* catfor user in $(cat /etc/passwd | cut -f1 -d:); do crontab -l -u $user; done是否有某个定时任务运行过于频繁? 是否有些用户提交了隐藏的定时任务? 在出现故障的时候是否正好有某个备份任务在执行
(13) 应用系统日志
这里边可分析的东西就多了, 不过恐怕你作为运维人员是没功夫去仔细研究它的。关注那些明显的问题比如在一个典型的LAMPLinuxApacheMysqlPerl应用环境里: Apache Nginx; 查找访问和错误日志, 直接找 5xx 错误, 再看看是否有 limit_zone错误。 MySQL; 在mysql.log找错误消息看看有没有结构损坏的表 是否有innodb修复进程在运行是否有disk/index/query 问题. PHP-FPM; 如果设定了 php-slow 日志, 直接找错误信息 (php, mysql, memcache, …)如果没设定赶紧设定。 Varnish; 在varnishlog 和 varnishstat 里, 检查 hit/miss比. 看看配置信息里是否遗漏了什么规则使最终用户可以直接攻击你的后端 HA-Proxy; 后端的状况如何健康状况检查是否成功是前端还是后端的队列大小达到最大值了
Linux运维日常巡检脚本
#!/bin/bash
#author by acrossyao
#date: 2021-02-08
#巡检脚本
echo ---------------------------------------「OS系统巡检信息」---------------------------------------
#OS_IPhostname -i | awk {print $1}
OS_IP
IPLISThostname -i
for elem in $IPLIST
do
regex\b(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9])\b
ckStep2echo $elem | egrep $regex | wc -l
if [ $ckStep2 -eq 0 ]
then
aa1
else
OS_IP$elem,
fi
done
OS_HOSTNAMEhostname
OS_RUN_TIMEuptime |awk {print $3,$4}|awk -F, {print $1}
echo 系统IP地址: $OS_IP
echo 主机名称: $OS_HOSTNAME
echo 运行时间: $OS_RUN_TIME
#内存
OS_MEM_TALfree -m | grep Mem | awk {print $2}
OS_MEM_FREEfree -m | grep Mem | awk {print $7}
echo 内存总量: ${OS_MEM_TAL}MB
echo 内存余量: ${OS_MEM_FREE}MB
#磁盘使用占比
OS_ROOT_DISKS_USE_PRECENTdf -h / | grep /| awk {print $5}
OS_ROOT_DISKS_AVAILdf -h / | grep /| awk {print $4}
OS_DATA_DISKS_USE_PRECENTdf -h | grep /data| awk {print $5}
OS_DATA_DISKS_AVAILdf -h | grep /data| awk {print $4}
echo 根卷使用占比: ${OS_ROOT_DISKS_USE_PRECENT}, 根卷空闲: ${OS_ROOT_DISKS_AVAIL}
echo data卷使用占比: ${OS_DATA_DISKS_USE_PRECENT}, data卷空闲: ${OS_DATA_DISKS_AVAIL}
#CPU
CPU_LOADtop -bn1 | grep load | awk {printf CPU LOAD: %.2f\n, $(NF-2)}
CPU_IDLEtop -n1 | fgrep Cpu(s) | awk -F , {print $4}
echo ${CPU_LOAD}
echo CPU IDLE: ${CPU_IDLE}
echo ---------------------------------------「OS系统巡检结束」---------------------------------------系统指标巡检脚本
#!/bin/bash
menu(){
cat EOF
---------------------------------------------
| 日常巡检脚本 |
| 1.查看磁盘使用率 |
| 2.查看内存使用率 |
| 3.查看系统负载 |
| 4.统计系统连接数 |
| 5.统计系统进程数 |
| 6.统计当前磁盘分区信息 |
| 7.按q退出 |
| 8.按h帮助 |
---------------------------------------------
EOF
}
menu
while true
do
echo -en \033[34m请输入你要查看的内容\033[0m
read actionif [ $action q ];thenecho quiting....breakfiif [ $action h ];thenmenuficase $action in 1)df -h ;;2)free -h ;;3)uptime ;;4)ss -tan | grep -i estab | wc -l ;;5)ps aux | grep -v grep | wc -l ;;6)fdisk -l ;; *)echo Usage: $0 {1|2|3|4|5|6|q|h}esac
done 日常命令
1、查找当前目录下占用为0字节的文件并删除find ./ -type f -size 0 -exec rm -rf {}\; #此命令不要用于对根目录0字节文件的操作2、将系统进程按内存占用大小排列显示出来ps -e -o “%C : %p : %z : %a”|sort -k5-nr 3、将系统进程按CPU占用大小排列显示ps -e -o “%C : %p : %z : %a”|sort -nr4、匹配某文件中某一行并进行内容替换sed -i ‘/Root/s/no/yes’/etc/ssh/sshd_config #先匹配到Root再将此行no替换为yes5、显示所有运行级别为3并开机启动的服务ls /etc/rc3.d/S* |cut -c 15- #rc3.d中S开头即为运行级别3的服务并用cut截取第15个字符后面的内容6、取得eth0网卡的IP地址 方法1ifconfig | grep ‘inet addr:’| grep -v ’127.0.0.1′ | cut -d:-f2 | awk ‘{ print $1}’方法2ifconfig eth0 |grep “inet addr:” |awk ‘{print $2}’|cut -c 6-7、TCP抓包工具分析80端口数据流tcpdump -c 10000 -i eth0 -n dst port 808、查询昨天的日期date –dateyesterday9、删除所有空目录find /data -type d -empty -exec rm -rf {}; #最好不要在/目录下执行此命令10、删除5天前的文件find /data -mtime 5 -type f -exec rm -rf{};11、强制踢出终端用户pkill -KILL -t pts/112、将来自80端口的请求转发到8080端口iptables -A PREROUTING -p tcp -m tcp –dport80 -j DNAT –to-destination 127.0.0.1:808013、Linux服务器之间传文件scp ~/test.txtroot192.168.0.10:/data/ #将个人主目录下test.txt传到远程主机的/data目录下14、对大文件进行分割split -l 1000 message.log message #按每个文件1000行来分割split -b 5m message.log message #按每个文件5M来分割性能相关的命令
#查看当前系统load
uptime#查看系统状态和每个进程的系统资源使用状况
top#可视化显示CPU的使用状况
htop#查看每个CPU的负载信息
mpstat -P ALL 1#每隔1秒查看磁盘IO的统计信息
iostat -xkdz 1#每隔一秒查看虚拟内存的使用信息
vmstat 1#查看内存使用统计信息
free#查看网络使用信息
nicstat -z 1#类似vmstat的显示优化的工具
dstat 1#查看系统活动状态比如系统分页统计块设备IO统计等
sar#网络连接状态查看
netstat -s#进程资源使用信息查看
pidstat 1
pidstat -d 1#查看某个进程的系统调用信息 -p后面是进程id-tttT 进程系统后的系统调用时间
strace -tttT -p 12670
#统计IO设备输入输出的系统调用信息
strace -c dd if/dev/zero of/dev/null bs512 count1024k#tcpdump 查看网络数据包
tcpdump -nr /tmp/out.tcpdump#块设备的读写事件信息统计
btrace /dev/sdb #iotop查看某个进程的IO操作统计信息
iotop -bod5#slabtop 查看内核 slab内存分配器的使用信息
slabtop -sc#系统参数设置
sysctl -a#系统性能指标统计信息
perf stat gzip file1#系统cpu活动状态查看
perf record -a -g -F 997 sleep 10进程相关的命令
## processes 进程管理##ps查看当前系统执行的线程列表进行瞬间状态不是连续状态连续状态需要使用top名称查看 更多常用参数请使用 man ps查看
ps##显示所有进程详细信息
ps aux##-u 显示某个用户的进程列表
ps -f -u www-data ## -C 通过名字或者命令搜索进程
ps -C apache2## --sort 根据进程cpu使用率降序排列查看前5个进程 -pcpu表示降序 pcpu升序
ps aux --sort-pcpu | head -5 ##-f 用树结构显示进程的层次关系父子进程情况下
ps -f --forest -C apache2 ##显示一个父进程的所有子进程
ps -o pid,uname,comm -C apache2
ps --ppid 2359 ##显示一个进程的所有线程 -L 参数
ps -p 3150 -L ##显示进程的执行时间 -o参数
ps -e -o pid,comm,etime ##watch命令可以用来实时捕捉ps显示进程
watch -n 1 ps -e -o pid,uname,cmd,pmem,pcpu --sort-pmem,-pcpu | head -15 ##jobs 查看后台运行的进程 jobs命令执行的结果表示是一个当前的作业减号表是是一个当前作业之后的一个作业jobs -l选项可显示所有任务的PID,jobs的状态可以是running, stopped, Terminated,但是如果任务被终止了killshell 从当前的shell环境已知的列表中删除任务的进程标识也就是说jobs命令显示的是当前shell环境中所起的后台正在运行或者被挂起的任务信息
jobs##查看后台运营的进程号
jobs -p##查看现在被终止或者退出的进程号
jobs -n##kill命令 终止一个前台进程可以使用CtrlC键 kill 通过top或者ps获取进程id号 kill [-s 信号 | -p ] [ -a ] 进程号 ...
##发送指定的信号到相应进程。不指定型号将发送SIGTERM15终止指定进程。关闭进程号12的进程
kill 12##等同于在前台运行PID为123的进程时按下CtrlC键
kill -2 123##如果任无法终止该程序可用“-KILL” 参数其发送的信号为SIGKILL(9) 将强制结束进程
kill -9 123##列出所有信号名称
##HUP 1 终端断线
##INT 2 中断同 Ctrl C
##QUIT 3 退出同 Ctrl \
##TERM 15 终止
##KILL 9 强制终止
##CONT 18 继续与STOP相反 fg/bg命令
##STOP 19 暂停同 Ctrl Z
kill -l##得到指定信号的数值
kill -l KILL##杀死指定用户所有进程
kill -u peidalinux
kill -9 $(ps -ef | grep peidalinux) ##将后台中的命令调至前台继续运行 将进程123调至前台执行
fg 123##将一个在后台暂停的命令变成继续执行
bg 123##该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思 下面输出被重定向到myout.file文件中
nohup command myout.file 21 ##at计划任务在特定的时间执行某项工作在特定的时间执行一次。
## 格式at HH:MM YYYY-MM-DD //HH小时:MM分钟 YYYY年-MM月份-DD日
##HH[am pm]D(天) days //HH小时[am上午pm下午]days天
at 12:00时间 //at命令设定12:00执行一项操作
#atuseradd aaa //在at命令里设定添加用户aaa
#ctrld //退出at命令
#tail -f /etc/passwd //查看/etc/passwd文件后十行是否增加了一个用户aaa##计划任务设定后在没有执行之前我们可以用atq命令来查看系统没有执行工作任务。
atq##启动计划任务后如果不想启动设定好的计划任务可以使用atrm命令删除。
atrm 1 //删除计划任务1##pstree命令列出当前的进程以及它们的树状结构 格式pstree [选项] [pid|user]
pstree##nice命令改变程序执行的优先权等级 应用程序优先权值的范围从-2019数字越小优先权就越高。一般情况下普通应用程序的优先权值CPU使用权值都是0如果让常用程序拥有较高的优先权等级自然启动和运行速度都会快些。需要注意的是普通用户只能在019之间调整应用程序的优先权值只有超级用户有权调整更高的优先权值从-2019。
nice [-n 优先等级][--help][--version][命令]
nice -n 5 ls##sleep命令使进程暂停执行一段时间
date;sleep 1m;date##renice命令 renice命令允许用户修改一个正在运行进程的优先权。利用renice命令可以在命令执行时调整其优先权。
##其中参数number与nice命令的number意义相同。1 用户只能对自己所有的进程使用renice命令。2 root用户可以在任何进程上使用renice命令。3 只有root用户才能提高进程的优先权
renice -5 -p 5200 #PID为5200的进程nice设为-5 ##pmap命令用于显示一个或多个进程的内存状态。其报告进程的地址空间和内存状态信息 #pmap PID
pmap 20367javadump.sh
#!/bin/shDUMP_PIDSps --no-heading -C java -f --width 1000 |awk {print $2}
if [ -z $DUMP_PIDS ]; thenecho The server $HOST_NAME is not started!exit 1;
fiDUMP_ROOT~/dump
if [ ! -d $DUMP_ROOT ]; thenmkdir $DUMP_ROOT
fiDUMP_DATEdate %Y%m%d%H%M%S
DUMP_DIR$DUMP_ROOT/dump-$DUMP_DATE
if [ ! -d $DUMP_DIR ]; thenmkdir $DUMP_DIR
fifor PID in $DUMP_PIDS ; do
#Full thread dump 用来查线程占用死锁等问题$JAVA_HOME/bin/jstack $PID $DUMP_DIR/jstack-$PID.dump 21echo -e .\c
#打印出一个给定的Java进程、Java core文件或远程Debug服务器的Java配置信息具体包括Java系统属性和JVM命令行参数。$JAVA_HOME/bin/jinfo $PID $DUMP_DIR/jinfo-$PID.dump 21echo -e .\c
#jstat能够动态打印jvm(Java Virtual Machine Statistics Monitoring Tool)的相关统计信息。如young gc执行的次数、full gc执行的次数各个内存分区的空间大小和可使用量等信息。$JAVA_HOME/bin/jstat -gcutil $PID $DUMP_DIR/jstat-gcutil-$PID.dump 21echo -e .\c$JAVA_HOME/bin/jstat -gccapacity $PID $DUMP_DIR/jstat-gccapacity-$PID.dump 21echo -e .\c
#未指定选项时jmap打印共享对象的映射。对每个目标VM加载的共享对象其起始地址、映射大小及共享对象文件的完整路径将被打印出来 $JAVA_HOME/bin/jmap $PID $DUMP_DIR/jmap-$PID.dump 21echo -e .\c
#-heap打印堆情况的概要信息包括堆配置各堆空间的容量、已使用和空闲情况 $JAVA_HOME/bin/jmap -heap $PID $DUMP_DIR/jmap-heap-$PID.dump 21echo -e .\c
#-dump将jvm的堆中内存信息输出到一个文件中,然后可以通过eclipse memory analyzer进行分析
#注意这个jmap使用的时候jvm是处在假死状态的只能在服务瘫痪的时候为了解决问题来使用否则会造成服务中断。$JAVA_HOME/bin/jmap -dump:formatb,file$DUMP_DIR/jmap-dump-$PID.dump $PID 21echo -e .\c
#显示被进程打开的文件信息
if [ -r /usr/sbin/lsof ]; then/usr/sbin/lsof -p $PID $DUMP_DIR/lsof-$PID.dumpecho -e .\cfi
done
#主要负责收集、汇报与存储系统运行信息的。
if [ -r /usr/bin/sar ]; then/usr/bin/sar $DUMP_DIR/sar.dump
echo -e .\c
fi
#主要负责收集、汇报与存储系统运行信息的。
if [ -r /usr/bin/uptime ]; then/usr/bin/uptime $DUMP_DIR/uptime.dump
echo -e .\c
fi
#内存查看
if [ -r /usr/bin/free ]; then/usr/bin/free -t $DUMP_DIR/free.dump
echo -e .\c
fi
#可以得到关于进程、内存、内存分页、堵塞IO、traps及CPU活动的信息。
if [ -r /usr/bin/vmstat ]; then/usr/bin/vmstat $DUMP_DIR/vmstat.dump
echo -e .\c
fi
#报告与CPU相关的一些统计信息
if [ -r /usr/bin/mpstat ]; then/usr/bin/mpstat $DUMP_DIR/mpstat.dump
echo -e .\c
fi
#报告与IO相关的一些统计信息
if [ -r /usr/bin/iostat ]; then/usr/bin/iostat $DUMP_DIR/iostat.dump
echo -e .\c
fi
#报告与网络相关的一些统计信息
if [ -r /bin/netstat ]; then/bin/netstat $DUMP_DIR/netstat.dump
echo -e .\c
fi
echo OK!常用运维加固脚本
根据PID过滤进程所有信息
#! /bin/bash
# Function: 根据用户输入的PID过滤出该PID所有的信息
read -p 请输入要查询的PID: P
nps -aux| awk $2~/^$P$/{print $11}|wc -l
if [ $n -eq 0 ];thenecho 该PID不存在exit
fi
echo --------------------------------
echo 进程PID: $P
echo 进程命令ps -aux| awk $2~/^$P$/{print $11}
echo 进程所属用户: ps -aux| awk $2~/^$P$/{print $1}
echo CPU占用率ps -aux| awk $2~/^$P$/{print $3}%
echo 内存占用率ps -aux| awk $2~/^$P$/{print $4}%
echo 进程开始运行的时刻ps -aux| awk $2~/^$P$/{print $9}
echo 进程运行的时间ps -aux| awk $2~/^$P$/{print $10}
echo 进程状态ps -aux| awk $2~/^$P$/{print $8}
echo 进程虚拟内存ps -aux| awk $2~/^$P$/{print $5}
echo 进程共享内存ps -aux| awk $2~/^$P$/{print $6}
echo --------------------------------根据进程名过滤进程信息
会显示出该进程名包含的所有线程
#! /bin/bash
# Function: 根据输入的程序的名字过滤出所对应的PID并显示出详细信息如果有几个PID则全部显示
read -p 请输入要查询的进程名 NAME
Nps -aux | grep $NAME | grep -v grep | wc -l ##统计进程总数
if [ $N -le 0 ];thenecho 该进程名没有运行
fi
i1
while [ $N -gt 0 ]
doecho 进程PID: ps -aux | grep $NAME | grep -v grep | awk NR$i{print $0}| awk {print $2}echo 进程命令ps -aux | grep $NAME | grep -v grep | awk NR$i{print $0}| awk {print $11}echo 进程所属用户: ps -aux | grep $NAME | grep -v grep | awk NR$i{print $0}| awk {print $1}echo CPU占用率ps -aux | grep $NAME | grep -v grep | awk NR$i{print $0}| awk {print $3}%echo 内存占用率ps -aux | grep $NAME | grep -v grep | awk NR$i{print $0}| awk {print $4}%echo 进程开始运行的时刻ps -aux | grep $NAME | grep -v grep | awk NR$i{print $0}| awk {print $9}echo 进程运行的时间 ps -aux | grep $NAME | grep -v grep | awk NR$i{print $0}| awk {print $11}echo 进程状态ps -aux | grep $NAME | grep -v grep | awk NR$i{print $0}| awk {print $8}echo 进程虚拟内存ps -aux | grep $NAME | grep -v grep | awk NR$i{print $0}| awk {print $5}echo 进程共享内存ps -aux | grep $NAME | grep -v grep | awk NR$i{print $0}| awk {print $6}echo ***************************************************************let N-- i
done常用工具一键部署安装
#!/usr/bin/env bash# ---------------------------------------------------------------------------------
# 控制台颜色
BLACK\033[1;30m
RED\033[1;31m
GREEN\033[1;32m
YELLOW\033[1;33m
BLUE\033[1;34m
PURPLE\033[1;35m
CYAN\033[1;36m
RESET$(tput sgr0)
# ---------------------------------------------------------------------------------printf ${BLUE}\n
cat EOF
###################################################################################
# 安装常用命令工具
# 命令工具清单如下
# 核心工具df、du、chkconfig
# 网络工具ifconfig、netstat、route、iptables
# IP工具ip、ss、ping、tracepath、traceroute
# DNS工具dig、host、nslookup、whois
# 端口工具lsof、nc、telnet
# 下载工具curl、wget
# 编辑工具emacs、vim
# 流量工具iftop、nethogs
# 抓包工具tcpdump
# 压缩工具unzip、zip
# 版本控制工具git、subversion
#
###################################################################################
EOF
printf ${RESET}\nprintf \n${GREEN} 安装常用命令工具开始${RESET}\n# 核心工具
printf \n${CYAN} install coreutils(df、du)${RESET}\n
yum install -y coreutils
printf \n${CYAN} install chkconfig${RESET}\n
yum install -y chkconfig# 网络工具
printf \n${CYAN} install net-tools(ifconfig、netstat、route)${RESET}\n
yum install -y net-tools
printf \n${CYAN} install iptables${RESET}\n
yum install -y iptables# IP工具
printf \n${CYAN} install iputils(ping、tracepath)${RESET}\n
yum install -y iputils
printf \n${CYAN} install traceroute${RESET}\n
yum install -y traceroute
printf \n${CYAN} install iproute(ip、ss)${RESET}\n
yum install -y iproute# 端口工具
printf \n${CYAN} install lsof${RESET}\n
yum install -y lsof
printf \n${CYAN} install nc${RESET}\n
yum install -y nc
printf \n${CYAN} install netstat${RESET}\n
yum install -y netstat# DNS工具
printf \n${CYAN} install bind-utils(dig、host、nslookup)${RESET}\n
yum install -y bind-utils
printf \n${CYAN} install whois${RESET}\n
yum install -y whois# 下载工具
printf \n${CYAN} install curl${RESET}\n
yum install -y curl
printf \n${CYAN} install wget${RESET}\n
yum install -y wget# 编辑工具
printf \n${CYAN} install emacs${RESET}\n
yum install -y emacs
printf \n${CYAN} install vim${RESET}\n
yum install -y vim# 流量工具
printf \n${CYAN} install iftop${RESET}\n
yum install -y iftop
printf \n${CYAN} install nethogs${RESET}\n
yum install -y nethogs# 抓包工具
printf \n${CYAN} install tcpdump${RESET}\n
yum install -y tcpdump# 压缩工具
printf \n${CYAN} install unzip${RESET}\n
yum install -y unzip# 版本控制工具
printf \n${CYAN} install git${RESET}\n
yum install -y git
printf \n${CYAN} install subversion${RESET}\n
yum install -y subversionprintf \n${GREEN} 安装常用命令工具结束${RESET}\n常用lib库安装
lib库分为两种一种是静态链接lib库或者叫做静态lib库另一种叫做动态链接库dll库的lib导入库或称为lib导入库。
第一种是静态lib包含了所有的代码实现的是源代码文件.c或.cpp文件编译生成的这个lib库就是文本形式的源代码编译后的二进制形式代码。
第二种就是lib导入库这个库只是dll文件中的所有函数在dll文件中的地址的说明。
#!/usr/bin/env bash# ---------------------------------------------------------------------------------
# 控制台颜色
BLACK\033[1;30m
RED\033[1;31m
GREEN\033[1;32m
YELLOW\033[1;33m
BLUE\033[1;34m
PURPLE\033[1;35m
CYAN\033[1;36m
RESET$(tput sgr0)
# ---------------------------------------------------------------------------------printf ${BLUE}\n
cat EOF
###################################################################################
# 安装常见 lib
# 如果不知道命令在哪个 lib可以使用 yum search xxx 来查找
# lib 清单如下
# gcc gcc-c kernel-devel libtool
# openssl openssl-devel
# zlib zlib-devel
# pcre
###################################################################################
EOF
printf ${RESET}\nprintf \n${GREEN} 安装常见 lib 开始${RESET}\nprintf \n${CYAN} install gcc gcc-c kernel-devel libtool${RESET}\n
yum -y install make gcc gcc-c kernel-devel libtoolprintf \n${CYAN} install openssl openssl-devel${RESET}\n
yum -y install make openssl openssl-develprintf \n${CYAN} install zlib zlib-devel${RESET}\n
yum -y install make zlib zlib-develprintf \n${CYAN} install pcre${RESET}\n
yum -y install pcreprintf \n${GREEN} 安装常见 lib 结束${RESET}\n系统检查脚本
#!/usr/bin/env bash##############################################################################
# console color
C_RESET$(tput sgr0)
C_BLACK\033[1;30m
C_RED\033[1;31m
C_GREEN\033[1;32m
C_YELLOW\033[1;33m
C_BLUE\033[1;34m
C_PURPLE\033[1;35m
C_CYAN\033[1;36m
C_WHITE\033[1;37m
##############################################################################printf ${C_PURPLE}
cat EOF
###################################################################################
# 系统信息检查脚本
###################################################################################
EOF
printf ${C_RESET}[[ $(id -u) -gt 0 ]] echo 请用root用户执行此脚本 exit 1
sysversion$(rpm -q centos-release | cut -d- -f3)
double_line
line----------------------------------------------# 打印头部信息
printHeadInfo() {cat EOF
---------------------------------------------------------------------------------
| 欢迎使用 【系统信息检查脚本】 |
---------------------------------------------------------------------------------
EOF
}# 打印尾部信息
printFootInfo() {cat EOF
---------------------------------------------------------------------------------
| 脚本执行结束感谢使用|
---------------------------------------------------------------------------------
EOF
}options( 获取系统信息 获取服务信息 获取CPU信息 获取系统网络信息 获取系统内存信息 获取系统磁盘信息 获取CPU/内存占用TOP10 获取系统用户信息 输出所有信息 退出 )
printMenu() {printf ${C_BLUE}printf 主菜单\nfor i in ${!options[]}; doindexexpr ${i} 1valexpr ${index} % 2printf \t(%02d) %-30s ${index} ${options[$i]}if [[ ${val} -eq 0 ]]; thenprintf \nfidoneprintf ${C_BLUE}请输入需要执行的指令\nprintf ${C_RESET}
}# 获取系统信息
get_systatus_info() {sys_os$(uname -o)sys_release$(cat /etc/redhat-release)sys_kernel$(uname -r)sys_hostname$(hostname)sys_selinux$(getenforce)sys_lang$(echo $LANG)sys_lastreboot$(who -b | awk {print $3,$4})sys_runtime$(uptime | awk {print $3,$4} | cut -d, -f1)sys_time$(date)sys_load$(uptime | cut -d: -f5)cat EOF
【系统信息】
系统: ${sys_os}
发行版本: ${sys_release}
系统内核: ${sys_kernel}
主机名: ${sys_hostname}
selinux状态: ${sys_selinux}
系统语言: ${sys_lang}
系统当前时间: ${sys_time}
系统最后重启时间: ${sys_lastreboot}
系统运行时间: ${sys_runtime}
系统负载: ${sys_load}
EOF
}# 获取CPU信息
get_cpu_info() {Physical_CPUs$(grep physical id /proc/cpuinfo | sort | uniq | wc -l)Virt_CPUs$(grep processor /proc/cpuinfo | wc -l)CPU_Kernels$(grep cores /proc/cpuinfo | uniq | awk -F : {print $2})CPU_Type$(grep model name /proc/cpuinfo | awk -F : {print $2} | sort | uniq)CPU_Arch$(uname -m)cat EOF
【CPU信息】
物理CPU个数:$Physical_CPUs
逻辑CPU个数:$Virt_CPUs
每CPU核心数:$CPU_Kernels
CPU型号:$CPU_Type
CPU架构:$CPU_Arch
EOF
}# 获取服务信息
get_service_info() {port_listen$(netstat -lntup | grep -v Active Internet)kernel_config$(sysctl -p 2 /dev/null)if [[ ${sysversion} -gt 6 ]]; thenservice_config$(systemctl list-unit-files --typeservice --stateenabled | grep enabled)run_service$(systemctl list-units --typeservice --staterunning | grep .service)elseservice_config$(/sbin/chkconfig | grep -E :on|:启用 | column -t)run_service$(/sbin/service --status-all | grep -E running)ficat EOF
【服务信息】
${service_config}${line}
运行的服务:
${run_service}${line}
监听端口:
${port_listen}${line}
内核参考配置:
${kernel_config}
EOF
}# 获取系统内存信息
get_mem_info() {check_mem$(free -m)MemTotal$(grep MemTotal /proc/meminfo | awk {print $2}) #KBMemFree$(grep MemFree /proc/meminfo | awk {print $2}) #KBlet MemUsedMemTotal-MemFreeMemPercent$(awk BEGIN {if($MemTotal0){printf 100}else{printf \%.2f\,$MemUsed*100/$MemTotal}})report_MemTotal$((MemTotal/1024)) MB #内存总容量(MB)report_MemFree$((MemFree/1024)) MB #内存剩余(MB)report_MemUsedPercent$(free | sed -n 2p | gawk x int(( $3 / $2 ) * 100) {print x} | sed s/$/%/)cat EOF
【内存信息】
内存总容量(MB): ${report_MemTotal}
内存剩余量(MB):${report_MemFree}
内存使用率: ${report_MemUsedPercent}
EOF
}# 获取系统网络信息
get_net_info() {pri_ipadd$(ip addr | awk /^[0-9]: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/, \\1, g, $2)})pub_ipadd$(curl ifconfig.me -s)gateway$(ip route | grep default | awk {print $3})mac_info$(ip link | egrep -v lo | grep link | awk {print $2})dns_config$(egrep -v ^$|^# /etc/resolv.conf)route_info$(route -n)cat EOF
【网络信息】
系统公网地址:${pub_ipadd}
系统私网地址:${pri_ipadd}
网关地址:${gateway}
MAC地址:${mac_info}
路由信息:
${route_info}
DNS 信息:
${dns_config}
EOF
}# 获取系统磁盘信息
get_disk_info() {disk_info$(fdisk -l | grep Disk /dev | cut -d, -f1)disk_use$(df -hTP | awk $2!tmpfs{print})disk_percent$(free | sed -n 2p | gawk x int(( $3 / $2 ) * 100) {print x} | sed s/$/%/)disk_inode$(df -hiP | awk $1!tmpfs{print})cat EOF
【磁盘信息】
${disk_info}
磁盘使用: ${disk_use}
磁盘使用百分比: ${disk_percent}
inode信息: ${disk_inode}
EOF
}# 获取系统用户信息
get_sys_user() {login_user$(awk -F: {if ($NF/bin/bash) print $0} /etc/passwd)ssh_config$(egrep -v ^#|^$ /etc/ssh/sshd_config)sudo_config$(egrep -v ^#|^$ /etc/sudoers | grep -v ^Defaults)host_config$(egrep -v ^#|^$ /etc/hosts)crond_config$(for cronuser in /var/spool/cron/*; dols ${cronuser} 2 /dev/null | cut -d/ -f5; egrep -v ^$|^# ${cronuser} 2 /dev/null;echo ;done)cat EOF
【用户信息】
系统登录用户:
${login_user}${line}
ssh 配置信息:
${ssh_config}${line}
sudo 配置用户:
${sudo_config}${line}
定时任务配置:
${crond_config}${line}
hosts 信息:
${host_config}
EOF
}# 获取CPU/内存占用TOP10
get_process_top_info() {top_title$(top -b n1 | head -7 | tail -1)cpu_top10$(top -b n1 | head -17 | tail -11)mem_top10$(top -b n1 | head -17 | tail -10 | sort -k10 -r)cat EOF
【TOP10】
CPU占用TOP10:
${cpu_top10}
内存占用TOP10:
${top_title}${mem_top10}
EOF
}show_dead_process() {printf 僵尸进程\nps -al | gawk {print $2,$4} | grep Z
}get_all_info() {get_systatus_infoecho ${double_line}get_service_infoecho ${double_line}get_cpu_infoecho ${double_line}get_net_infoecho ${double_line}get_mem_infoecho ${double_line}get_disk_infoecho ${double_line}get_process_top_infoecho ${double_line}get_sys_user
}main() {while [[ 1 ]]doprintMenuread optionlocal index$[ ${option} - 1 ]case ${options[${index}]} in获取系统信息)get_systatus_info ;;获取服务信息)get_service_info ;;获取CPU信息)get_cpu_info ;;获取系统网络信息)get_net_info ;;获取系统内存信息)get_mem_info ;;获取系统磁盘信息)get_disk_info ;;获取CPU/内存占用TOP10)get_process_top_info ;;获取系统用户信息)get_sys_user ;;输出所有信息)get_all_info sys.logprintf ${C_GREEN}信息已经输出到 sys.log 中。${C_RESET}\n\n;;退出)exit ;;*)clearecho 抱歉不支持此选项 ;;esacdone
}######################################## MAIN ########################################
printHeadInfo
main
printFootInfo
printf ${C_RESET}
SPN 日常巡查脚本
SPN(Secret Private Network),面向业务的内网安全解决方案,即加密虚拟网络
#!/bin/bash
echo ___ ___ ___/ /\ / /\ /__/\/ /:/_ / /::\ \ \:\/ /:/ /\ / /:/\:\ \ \:\/ /:/ /::\ / /:/~/:/ _____\__\:\/__/:/ /:/\:\ /__/:/ /:/ /__/::::::::\\ \:\/:/~/:/ \ \:\/:/ \ \:\~~\~~\/\ \::/ /:/ \ \::/ \ \:\ \__\/ /:/ \ \:\ \ \:\/__/:/ \ \:\ \ \:\\__\/ \__\/ \__\/echo SPN 日常巡查脚本输出
# 清理屏幕
clearfunction bash_os() {# 系统基础信息#内核信息kernel$(uname -r)#操作系统版本release$(cat /etc/redhat-release)#主机名称hostname$HOSTNAME#当前时间及运行时间dateload$(uptime | awk -F , {print $1})# 当前登录用户数users$(uptime | awk -F , {print $3})echo -e \n\033[32m############## 系统基础信息 #######\033[0m\necho -e \033[32m------------------------------------\033[0mecho -e |内核信息:\033[31m $kernel \033[0mecho -e \033[32m------------------------------------\033[0mecho -e |操作系统版本:\033[31m $release \033[0mecho -e \033[32m------------------------------------\033[0mecho -e |当前时间及运行时间:\033[31m $dateload \033[0mecho -e \033[32m------------------------------------\033[0mecho -e |当前登录用户数:\033[31m $users \033[0mecho -e \033[32m------------------------------------\033[0m
}function memory() {# 内存相关数据统计free -m#总内存容量mem_total$(free -m | awk /Mem/{printf %.2fG, $2/1024})# 用户程序占用内存量mem_user$(free -m | awk /Mem/{printf %.2fG, $3/1024})# 多进程共享占用内存量mem_shared$(free -m | awk /Mem/{printf %.2fG, $5/1024})#缓存占用内存量mem_buff_cache$(free -m | awk /Mem/{printf %.fMB, $(NF-1)})#空闲内存容量mem_free$(free -m | awk /Mem/{printf %.2fG, $4/1024 })# 剩余可用内存容量mem_available$(free -m | awk NR2{printf %.2fG,$NF/1024})# 可用内存使用占比mem_percentage$(free -m | awk /Mem/{printf %.2f, $NF/$2*100})#总的交换分区容量swap_total$(free -m | awk /Swap/{printf %.2fG, $2/1024})#用户使用的交换分区容量swap_user$(free -m | awk /Swap/{printf %.2fG,$3/1024})#剩余交换分区容量swap_free$(free -m | awk /Swap/{printf %.2fG,$4/1024})#可用交换分区占比swap_percentage$(free -m | awk /Swap/{printf %.2f,$4/$2*100})#占用内存资源最多的10个进程列表top_proc_mem$(ps --no-headers -eo rss,args | sort -k1 -n -r | head -10)echo -e \n\033[32m################## 内存 ############\033[0m\necho -e \033[32m------------------------------------\033[0mecho -e |总内存容量:\033[31m $mem_total \033[0mecho -e \033[32m------------------------------------\033[0mecho -e |用户程序内存量:\033[31m $mem_user \033[0mecho -e \033[32m------------------------------------\033[0mecho -e |多进程共享内存量:\033[31m $mem_shared \033[0mecho -e \033[32m------------------------------------\033[0mecho -e |缓存占用内存量:\033[31m $mem_buff_cache \033[0mecho -e \033[32m------------------------------------\033[0mecho -e |空闲内存容量:\033[31m $mem_free \033[0mecho -e \033[32m------------------------------------\033[0mecho -e |剩余可用内存容量:\033[31m $mem_available \033[0mecho -e \033[32m------------------------------------\033[0mecho -e |可用内存百分比\033[31m $mem_percentage% \033[0mecho -e \033[32m------------------------------------\033[0mecho -e \033[32m############## 交换分区 #############\033[0m\necho -e \033[32m------------------------------------\033[0mecho -e 总的交换分区容量\033[31m $swap_total \033[0mecho -e \033[32m------------------------------------\033[0mecho -e |用户使用的交换分区容量\033[31m $swap_user \033[0mecho -e \033[32m------------------------------------\033[0mecho -e |剩余交换分区容量\033[31m ${swap_free}echo -e \033[32m------------------------------------\033[0mif [ $(free -m | awk /Swap/{print $2}) -ne 0 ]; thenecho -e |可用交换分区占比\033[31m $swap_percentage% \033[0mecho -e \033[32m------------------------------------\033[0mfiecho -e |占用内存资源最多的10个进程列表:echo -e \033[31m$top_proc_mem% \033[0mecho -e \033[32m------------------------------------\033[0m
}function cpu() {#CPU型号cpu_info$(LANGC lscpu | awk -F: /Model name/ {print $2})#CPU内核数量cpu_core$(awk /processor/{core} END{print core} /proc/cpuinfo)#CPU最近1/5/15分钟的平均负载load1515$(uptime | sed s/,/ /g | awk {for(iNF-2;iNF;i)print $i } | xargs)#发生中断数量irq$(vmstat 1 1 | awk NR3{print $11})#上下文切换数量cs$(vmstat 1 1 | awk NR3{print $12})#占用CPU资源最多的10个进程列表top_proc_cpu$(ps --no-headers -eo %cpu,args | sort -k1 -n -r | head -10)echo -e \n\033[32m################## CPU 相关 ############\033[0m\necho -e \033[32m------------------------------------\033[0mecho -e |CPU型号:\033[31m$cpu_info \033[0mecho -e \033[32m------------------------------------\033[0mecho -e |CPU内核数量:\033[31m$cpu_core \033[0mecho -e \033[32m------------------------------------\033[0mecho -e |CPU最近1/5/15分钟的平均负载:\033[31m$load1515 \033[0mecho -e \033[32m------------------------------------\033[0mecho -e |CPU中断数量:\033[31m$irq \033[0mecho -e \033[32m------------------------------------\033[0mecho -e |上下文切换数量:\033[31m$cs \033[0mecho -e \033[32m------------------------------------\033[0mecho -e |占用CPU资源最多的10个进程列表:echo -e \033[31m$top_proc_cpu \033[0mecho -e \033[32m------------------------------------\033[0m}function disk_io() {#分区挂载信息disk$(df -h)# 磁盘总数disk_total$(vmstat -D | awk NR1{print $1})# 分区总数disk_sub$(vmstat -D | awk NR2{print $1})#磁盘分区信息lsblk_$(lsblk -n)#写入磁盘的总块数bo$(vmstat 1 1 | awk NR3{print $10})#从磁盘读出的块数bi$(vmstat 1 1 | awk NR3{print $9})#每秒写磁盘块的速率wa$(vmstat 1 1 | awk NR3{print $16})echo -e \n\033[32m################## 磁盘IO 相关 ############\033[0m\necho -e \033[32m------------------------------------\033[0mecho -e |磁盘总数:\033[31m$disk_total \033[0mecho -e \033[32m------------------------------------\033[0mecho -e |分区总数:\033[31m$disk_sub \033[0mecho -e \033[32m------------------------------------\033[0mecho -e |磁盘分区信息:echo -e \033[31m$lsblk_ \033[0mecho -e \033[32m------------------------------------\033[0mecho -e |写入磁盘的总块数:\033[31m$bo \033[0mecho -e \033[32m------------------------------------\033[0mecho -e |从磁盘读出的块数:\033[31m$bi \033[0mecho -e \033[32m------------------------------------\033[0mecho -e |每秒写磁盘块的速率:\033[31m$wa \033[0mecho -e \033[32m------------------------------------\033[0mecho -e |分区挂载信息:echo -e \033[31m$disk \033[0mecho -e \033[32m------------------------------------\033[0m}function procs() {#进程数量procs$(ps aux | wc -l)#用户的最大进程数ulimit_$(ulimit -u)#内核设置的最大进程数pid_max$(sysctl kernel.pid_max | awk {print $3})echo -e \n\033[32m################## 进程 相关 ############\033[0m\necho -e \033[32m------------------------------------\033[0mecho -e |进程数量:\033[31m$procs \033[0mecho -e \033[32m------------------------------------\033[0mecho -e |用户的最大进程数:\033[31m$ulimit_ \033[0mecho -e \033[32m------------------------------------\033[0mecho -e |内核设置的最大进程数:\033[31m$pid_max \033[0mecho -e \033[32m------------------------------------\033[0m}function network() {#获取网卡流量信息,接收|发送的数据流量,单位为字节(bytes)net_monitor$(cat /proc/net/dev | tail -n 3 | awk BEGIN{ print 网卡名称 入站数据流量(bytes) 出站数据流量(bytes)} {print $1,$2,$10} | column -t)#获取暴露端口信息ip_port$(ss -ntulpa)#本地IP地址列表localip$(ip a s | awk /inet /{print $2} )echo -e \n\033[32m################## 网络 相关 ############\033[0m\necho -e |本地IP地址列表:echo -e \033[31m$localip \033[0mecho -e \033[32m------------------------------------\033[0mecho -e |获取网卡流量信息:echo -e \033[31m$net_monitor \033[0mecho -e \033[32m------------------------------------\033[0mecho -e |获取暴露端口信息:echo -e \033[31m$ip_port \033[0mecho -e \033[32m------------------------------------\033[0m}case $1 in
all)bash_osmemorycpudisk_ioprocsnetwork;;
bash_os)bash_os;;
memory)memory;;
cpu)cpu;;
disk_io)disk_io;;
procs)procs;;
network)network;;
*)echo Usage: bash_os|memory|cup|disk_io|procs|network|all;;
esacffmpeg脚本
FFmpeg是一套可以用来记录、转换数字音频、视频并能将其转化为流的开源计算机程序
打开进程并判断进程数量
原版本
#!/bin/bash
ffmpegPid $( ps -ef | grep -E ffmpeg.*$1$2$3 | grep -v grep | awk {print $2})
if [ -z $ffmpegPid ]
thenthreadNum $( ps -ef | grep ffmpeg | grep -v grep | wc -l | awk {print $1})if [$threadNum -gt 10]then# 线程数大于10个需要干掉ffmpeg线程echo threadNum too more!for thread in $threadNumdokill -9 ${thread}doneelsenohup ffmpeg -re -rtsp_transport tcp -i rtsp://ip:port/dss/monitor/params?cameraid$1%24$2substream$3 -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 $4 /Users/chuxiaowei/ffmpeg$1$2$3.log 21 ps -ef | grep -E ffmpeg.*$1$2$3 | grep -v grep | awk {print $2}fi
elseps -ef | grep -E ffmpeg.*$1$2$3 | grep -v grep | awk {print $2}
fi改进之后
#!/bin/bash
ffmpegPid $( ps -ef | grep -E ffmpeg.*$1$2$3 | grep -v grep | awk {print $2})
if [ -z $ffmpegPid ]
thennohup ffmpeg -re -rtsp_transport tcp -i rtsp://ip:port/dss/monitor/params?cameraid$1%24$2substream$3 -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 $4 /root/ffmpeg$1$2$3.log 21 ps -ef | grep -E ffmpeg.*$4* | grep -v grep | awk {print $2}
fi关闭进程
#关闭进程
#!/bin/bash
ps -ef | grep -E ffmpeg.*$1* | grep -v grep | awk {print $2} | xargs killjava jar包启动-剔除Pom中依赖
#!/bin/bash
pid$(ps -ef | grep java | grep -E *rtsptortmp.* | awk {print $2})
echo pid $pid
if [ $pid ];thenkill -9 $pidecho kill the process rtsptortmp pid $pid
finohup java -Dloader.path/root/rtsptortmplib -jar rtsptortmp-1.0-SNAPSHOT.jar --spring.profiles.activeprod /root/logs/rtsptortmp.log 21
tail -f /root/logs/rtsptortmp.logJava jar包通用启动脚本
eg ./start.sh java.jar
#!/bin/bash
pid$(ps -ef | grep java | grep -E *$1* | awk {print $2})
echo pid $pid
if [ $pid ];thenkill -9 $pidecho kill the process pid $pid
finohup java -jar -Xms256m -Xmx256m $1 --spring.profiles.activeprod /root/logs/$1.log 21
tail -f /root/logs/$1.log查看centos配置信息脚本
#!/bin/bashecho cpu个数
grep physical id /proc/cpuinfo | sort -u | wc -lecho cpu核数
cat /proc/cpuinfo | grep cpu cores | uniqecho cpu型号
cat /proc/cpuinfo | grep model name |uniqecho cpu内核频率
cat /proc/cpuinfo |grep MHz|uniqecho cpu统计信息
lscpuecho 内存总数
cat /proc/meminfo | grep MemTotalecho 内核版本
cat /proc/versionecho 操作系统内核信息
uname -aecho 磁盘信息
fdisk -lJenkins项目打包发布脚本
#!/bin/bash//传入的war包名称
name$1
//war包所在目录
path$2
//上传的war包位置
path_w$3
//如果项目正在运行就杀死进程
if [ -f $path/$name ];thenecho delete the file $namerm -f $path/$name
elseecho the file $name is not exist
fi
//把jenkins上传的war包拷贝到我们所在目录
cp $path_w/$name $path/
echo copy the file $name from $path_w to $path//获取该项目正在运行的pid
pid$(ps -ef | grep java | grep $name | awk {print $2})
echo pid $pid
//如果项目正在运行就杀死进程
if [ $pid ];thenkill -9 $pidecho kill the process $name pid $pid
elseecho process is not exist
fi
//要切换到项目目录下才能在项目目录下生成日志
cd $path
//防止被jenkins杀掉进程 BUILD_IDdontKillMe
BUILD_IDdontKillMe
//启动项目
nohup java -server -Xms256m -Xmx512m -jar -Dserver.port20000 $name nohup.out 21
//判断项目是否启动成功
pid_new$(ps -ef | grep java | grep $name | awk {print $2})
if [ $? -eq 0 ];then
echo this application $name is starting pid_new $pid_new
else
echo this application $name startup failure
fi
echo $! /var/run/myClass.pid
echo over注意SQL Server以下脚本目前还不完善(AlwaysOn相关 到 Agent作业备份)
AlwaysOn相关 节点切换监控 节点切换作业控制 SQL Server 邮件脚本 Mysql-使用脚本进行分库分表备份 数据库-数据备份 备份作业 数据一致性检查 Agent作业备份
大部分脚本针对于中小数据库由于工作性质涉及很多客户部署维护作业所以力求总结出一套比较完善的脚本一键部署。
AlwaysOn相关
节点切换监控
declare role VARCHAR(8000); declare email_conetent varchar(8000);--存放邮件正文 declare name varchar(100);declare lastsend int;
declare subject_str varchar(100);set name (select servername)
set subject_str name always on 预警set role(SELECT role FROM sys.dm_hadr_availability_replica_states WHERE is_local1)set lastsend (select isnull(datediff(MINUTE,max(send_request_date), getdate()),6000) from [msdb].[dbo].[sysmail_mailitems] where subject subject_str)if role 1 and lastsend 30 ----30分钟发送一次begin set email_conetent(name当前节点不是主节点发生故障转移)print(email_conetent)
print(lastsend)
--if lastsend 1--发送邮件 --邮件正文内容EXEC msdb.dbo.sp_send_dbmail profile_name DB-mail, --配置文件名称recipients KK_XXX163.COM, --收件email地址subject subject_str, --邮件主题body email_conetent end节点切换作业控制
作业可以采用手动控制或如下脚本也可以修改作业在作业执行前增加节点判断
--------------------------判断当前节点是否为主节点 如果不是则禁用作业 -------
------------节点 切换为主节点则启用JOB ------------
DECLARE ROLE tinyint
DECLARE ENABLE tinyint
----判断是否是主节点 --1 主节点SELECT rolerole FROM sys.dm_hadr_availability_replica_states WHERE is_local1--判断JOB状态 --0 禁用 1 启用
--以syspolicy_purge_history 为 参照 --如果 禁用或删除syspolicy_purge_history请修改 ENABLE下段查询
SELECT ENABLE [ENABLED]
FROM MSDB.[dbo].[sysjobs]
WHERE NAME syspolicy_purge_history-----第一次切换 辅助节点没有创建CDC作业 job 则创建作业 [category_id] 13 CDC LOG SCAN JOB
if not exists (select 1 from msdb.dbo.sysjobs where [category_id] 13 or [category_id] 16 ) and ROLE 1
begin
EXEC sys.sp_cdc_add_job job_type capture;
EXEC sys.sp_cdc_add_job job_type cleanup;
end---primary and job disable set job enable
IF ROLE 1 and ENABLE 0
BEGIN----如果存在原有作业为禁用,无法确定哪些JOB需要开启....所以此处最好手动维护作业的启用和禁用
EXEC msdb.dbo.sp_update_jobjob_name NXXXXX,enabled 1 ;-----执行 CDC
EXEC msdb.dbo.sp_start_job job_name Ncdc.XX_capture
EXEC msdb.dbo.sp_start_job job_name Ncdc.XX_cleanup
end
---not primary and job enable set disable
IF ROLE 1 and ENABLE 1
BEGIN
----如果存在原有作业为禁用,无法确定哪些JOB需要开启....所以此处最好手动维护作业的启用和禁用
EXEC msdb.dbo.sp_update_jobjob_name NXXXXX,enabled 0 ;END
SQL Server 邮件脚本
邮件主要用来监控作业是否运行成功如果您已经配置了类似zabbix等软件请忽略 配置邮件服务
--SQL Server 并没有内置邮件服务器Mail Server它跟我们发送邮件一样需要用户名和密码通过 SMTPSimple Message Transfer Protocol去连接邮件服务器。我们想让 SQL Server 来发送邮件首先要告诉它用户名称密码服务器地址网络传送协议邮件服务器的端口。。。等信息。
-- 以下脚本实现了数据库邮件的配置
----下面是具体的配置邮件步骤
----在 sa 系统帐户下运行。
--
--1. 启用 SQL Server 邮件功能。
use master
go
exec sp_configure show advanced options,1
go
reconfigure with override
go
exec sp_configure Database Mail XPs,1
go
reconfigure with override
go
--2. 在 SQL Server 中添加邮件帐户account
exec msdb..sysmail_add_account_spaccount_name 163yx -- 邮件帐户名称SQL Server 使用,email_address kk_XXXX163.com -- 发件人邮件地址,display_name null -- 发件人姓名,replyto_address null,description null,mailserver_name smtp.163.com -- 邮件服务器地址,mailserver_type SMTP -- 邮件协议SQL 2005 只支持 SMTP,port 25 -- 邮件服务器端口,username kk_XXXX163.com -- 用户名,password XXXXX -- 密码,use_default_credentials 0,enable_ssl 0,account_id null--3. 在 SQL Server 中添加 profile
exec msdb..sysmail_add_profile_sp profile_name dba_profile3 -- profile 名称 ,description dba mail profile -- profile 描述 ,profile_id null-- 在 SQL Server 中映射 account 和 profile
exec msdb..sysmail_add_profileaccount_sp profile_name dba_profile3 -- profile 名称 ,account_name 163yx -- account 名称 ,sequence_number 1 -- account 在 profile 中顺序 --5. 利用 SQL Server Database Mail 功能发送邮件。
exec msdb..sp_send_dbmail profile_name dba_profile3 -- profile 名称 ,recipients kk_XXXX163.com;kk2_XXXX163.com -- 收件人邮箱 ,subject SQL Server Mail 测试 -- 邮件标题 ,body Hello Mail!测试 -- 邮件内容 ,body_format TEXT -- 邮件格式 ,file_attachments c:\a.txt --邮件附件--6. 查看邮件发送情况
use msdb
go
select * from sysmail_allitems
select * from sysmail_mailitems
select * from sysmail_event_log --如果不是以 sa 帐户发送邮件则可能会出现错误
--
--Msg 229, Level 14, State 5, Procedure sp_send_dbmail, Line 1
--EXECUTE permission denied on object sp_send_dbmail, database msdb, schema dbo.
--
--这是因为当前 SQL Server 登陆帐户login在 msdb 数据库中没有发送数据库邮件的权限需要加入 msdb 数据库用户并通过加入 sp_addrolemember 角色赋予权限。假设该SQL Server 登陆帐户名字为 “dba”
--
--use msdb
--go
--
--create user dba for login dba
--go
--
--exec dbo.sp_addrolemember rolename DatabaseMailUserRole,
-- membername dba
--go
--
--此时再次发送数据库邮件仍可能有错误
--
--Msg 14607, Level 16, State 1, Procedure sp_send_dbmail, Line 119
--profile name is not valid
--
--虽然数据库用户 “dba” 已经在 msdb 中拥有发送邮件的权限了但这还不够他还需要有使用 profile“dba_profile” 的权限。
--
--use msdb
--go
--
--exec sysmail_add_principalprofile_sp principal_name dba
-- ,profile_name dba_profile
-- ,is_default 1
--
--从上面的参数 is_default1 可以看出一个数据库用户可以在多个 mail profile 拥有发送权限。--EXEC msdb.dbo.sysmail_configure_sp MaxFileSize, 100000000 字节设置邮件.note
配置操作员 USE [msdb]
GO
EXEC msdb.dbo.sp_add_operator nameNmail_user2, enabled1, pager_days0, email_addressNKK_XXXX.163.COM
GOMysql-使用脚本进行分库分表备份
[rootctos3 ~]# cat bak.sh
#!/bin/bashMYUSERroot
MYPASSguoke123
MYLOGmysql -u$MYUSER -p$MYPASS -e
MYDUMPmysqldump -u$MYUSER -p$MYPASS -x -F
DBLIST$($MYLOG show databases; | sed 1d | grep -Ev info|mysq|per|sys)
DIR/backup
[ ! -d $DIR ] mkdir $DIR
cd $DIRfor dbname in $DBLIST
doTABLIST$($MYLOG show tables from $dbname; | sed 1d)
for tabname in $TABLIST
domkdir -p $DIR/$dbname$MYDUMP $dbname $tabname --events |gzip $DIR/${dbname}/${tabname}_$(date %F_%T).sql.gz
done
done数据库-数据备份
备份方案每天全备份、6小时一次差异备份、一小时一次日志备份。
备份存储过程 存储过程创建后会保留在master库中存储过程主要控制备份逻辑备份路径等。
存储过程中只有一个类型参数用于控制全备/差异/日志备份可根据需要修改。
USE [master]
GO/****** Object: StoredProcedure [dbo].[sp_BackupDatabase] Script Date: 01/22/2015 13:52:46 ******/
SET ANSI_NULLS ON
GOSET QUOTED_IDENTIFIER ON
GO-- Author: KK-- Create date: 2016-09-27-- Description: 备份数据库,备份路径F:\KK_BackUp\ 可自行修改-- http://www.cnblogs.com/double-K/-- Parameter1: 备份类型 F全部, D差异, L日志alter PROCEDURE [dbo].[sp_BackupDatabase]
backupType CHAR(1)
AS
BEGIN
SET NOCOUNT ON;declare filepath_backup varchar(100)
declare dateTime varchar(30),del_time_stamp varchar(50)
DECLARE sqlCommand NVARCHAR(1000)---创建数据库对应文件夹
EXECUTE master.dbo.xp_create_subdir NF:\KK_BackUp\Full\
EXECUTE master.dbo.xp_create_subdir NF:\KK_BackUp\Difference\
EXECUTE master.dbo.xp_create_subdir NF:\KK_BackUp\Log_Bak\IF backupType F
set filepath_backupF:\KK_BackUp\Full\
IF backupType D
set filepath_backupF:\KK_BackUp\Difference\
IF backupType L
set filepath_backupF:\KK_BackUp\Log_Bak\SET ANSI_WARNINGS OFF
SET dateTime replace(convert(varchar,current_timestamp, 112)_convert(varchar,current_timestamp, 108),:,)----删除超过3天的备份文件
DECLARE delete_time datetime
set delete_time getdate() - 3EXECUTE master.dbo.xp_delete_file 0,NF:\kk_backup,Ntrn,delete_time,1
EXECUTE master.dbo.xp_delete_file 0,NF:\kk_backup,Nbak,delete_time,1SELECT dateTime replace(convert(varchar,current_timestamp, 112)_convert(varchar,current_timestamp, 108),:,)declare db_info cursor for
SELECT NAME,recovery_model FROM MASTER.SYS.databases
where state 0 ---只处理online的数据库
and name not in (tempdb,ReportServerTempDB,ReportServer) ----填写不需要备份的数据库declare databaseName nvarchar(128)
declare recovery_model int
OPEN db_info
fetch next from db_info into databaseName,recovery_model
while fetch_status0
Begin ---recovery_model 1 : FULL 2 : BULK_LOGGED 3:SIMPLE
---系统数据库只全备IF backupType F SET sqlCommand BACKUP DATABASE databaseName TO DISK filepath_backup databaseName _Full_dateTime.BAK with STATS 10, INIT, COMPRESSION, CHECKSUM IF backupType D and databaseName not in (master,msdb,model)SET sqlCommand BACKUP DATABASE databaseName TO DISK filepath_backup databaseName _Diff_ dateTime .BAK WITH DIFFERENTIAL, STATS 10, INIT, COMPRESSIONIF backupType L and recovery_model 3 and databaseName not in (master,msdb,model)
SET sqlCommand BACKUP LOG databaseName TO DISK filepath_backup databaseName _Log_ dateTime .TRN with STATS 10, INIT, COMPRESSION
print sqlCommandEXECUTE sp_executesql sqlCommand fetch next from db_info into databaseName,recovery_model
End close db_info
deallocate db_info PRINT -- Backup completed successfully at convert(varchar, getdate(), 120) SET ANSI_WARNINGS ON
END
GO
备份作业
备份作业很简单就是调用存储过程用计划控制备份频率
-- Author: KK-- Create date: 2016-09-27-- Description: 备份数据库,全备份每天一次 0点执行差异备份6小时一次日志备份1小时一次-- http://www.cnblogs.com/double-K/--需要备份的数据库未使用参数传递而是选择在存储过程中指定当添加新库时不需要修改任何脚本-- Parameter1: 备份类型 F全部, D差异, L日志-------------------完整备份作业-----------------
USE [msdb]
GO/****** Object: Job [FULL_BACKUP] Script Date: 2016/9/30 12:13:12 ******/
BEGIN TRANSACTION
DECLARE ReturnCode INT
SELECT ReturnCode 0
/****** Object: JobCategory [[Uncategorized (Local)]]] Script Date: 2016/9/30 12:13:12 ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE nameN[Uncategorized (Local)] AND category_class1)
BEGIN
EXEC ReturnCode msdb.dbo.sp_add_category classNJOB, typeNLOCAL, nameN[Uncategorized (Local)]
IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollbackENDDECLARE jobId BINARY(16)
EXEC ReturnCode msdb.dbo.sp_add_job job_nameNFULL_BACKUP, enabled1, notify_level_eventlog0, notify_level_email0, notify_level_netsend0, notify_level_page0, delete_level0, descriptionN系统全备份, category_nameN[Uncategorized (Local)], owner_login_nameNsa, job_id jobId OUTPUT
IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollback
/****** Object: Step [FULL_STEP1] Script Date: 2016/9/30 12:13:12 ******/
EXEC ReturnCode msdb.dbo.sp_add_jobstep job_idjobId, step_nameNFULL_STEP1, step_id1, cmdexec_success_code0, on_success_action1, on_success_step_id0, on_fail_action2, on_fail_step_id0, retry_attempts0, retry_interval0, os_run_priority0, subsystemNTSQL, commandN[dbo].[sp_BackupDatabase] F, database_nameNmaster, flags0
IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollback
EXEC ReturnCode msdb.dbo.sp_update_job job_id jobId, start_step_id 1
IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollback
EXEC ReturnCode msdb.dbo.sp_add_jobschedule job_idjobId, nameNEVERY_1d_zero, enabled1, freq_type4, freq_interval1, freq_subday_type1, freq_subday_interval0, freq_relative_interval0, freq_recurrence_factor0, active_start_date20160930, active_end_date99991231, active_start_time0, active_end_time235959, schedule_uidN813653e1-4128-4f47-b378-5a26b49085d0
IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollback
EXEC ReturnCode msdb.dbo.sp_add_jobserver job_id jobId, server_name N(local)
IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:IF (TRANCOUNT 0) ROLLBACK TRANSACTION
EndSave:GO-------------------日志备份作业------------------
USE [msdb]
GO/****** Object: Job [LOG_BACKUP] Script Date: 2016/9/30 12:13:25 ******/
BEGIN TRANSACTION
DECLARE ReturnCode INT
SELECT ReturnCode 0
/****** Object: JobCategory [[Uncategorized (Local)]]] Script Date: 2016/9/30 12:13:25 ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE nameN[Uncategorized (Local)] AND category_class1)
BEGIN
EXEC ReturnCode msdb.dbo.sp_add_category classNJOB, typeNLOCAL, nameN[Uncategorized (Local)]
IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollbackENDDECLARE jobId BINARY(16)
EXEC ReturnCode msdb.dbo.sp_add_job job_nameNLOG_BACKUP, enabled1, notify_level_eventlog0, notify_level_email0, notify_level_netsend0, notify_level_page0, delete_level0, descriptionN系统日志备份, category_nameN[Uncategorized (Local)], owner_login_nameNsa, job_id jobId OUTPUT
IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollback
/****** Object: Step [LOG_STEP1] Script Date: 2016/9/30 12:13:25 ******/
EXEC ReturnCode msdb.dbo.sp_add_jobstep job_idjobId, step_nameNLOG_STEP1, step_id1, cmdexec_success_code0, on_success_action1, on_success_step_id0, on_fail_action2, on_fail_step_id0, retry_attempts0, retry_interval0, os_run_priority0, subsystemNTSQL, commandN[dbo].[sp_BackupDatabase] L, database_nameNmaster, flags0
IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollback
EXEC ReturnCode msdb.dbo.sp_update_job job_id jobId, start_step_id 1
IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollback
EXEC ReturnCode msdb.dbo.sp_add_jobschedule job_idjobId, nameNEVERY_1h, enabled1, freq_type4, freq_interval1, freq_subday_type8, freq_subday_interval1, freq_relative_interval0, freq_recurrence_factor0, active_start_date20160930, active_end_date99991231, active_start_time0, active_end_time235959, schedule_uidN3d5ad87e-4f1d-46ef-9a24-e0f99c7d5c20
IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollback
EXEC ReturnCode msdb.dbo.sp_add_jobserver job_id jobId, server_name N(local)
IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:IF (TRANCOUNT 0) ROLLBACK TRANSACTION
EndSave:GO----------------------差异备份作业
USE [msdb]
GO/****** Object: Job [DIFF_BACKUP] Script Date: 2016/9/30 12:13:19 ******/
BEGIN TRANSACTION
DECLARE ReturnCode INT
SELECT ReturnCode 0
/****** Object: JobCategory [[Uncategorized (Local)]]] Script Date: 2016/9/30 12:13:19 ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE nameN[Uncategorized (Local)] AND category_class1)
BEGIN
EXEC ReturnCode msdb.dbo.sp_add_category classNJOB, typeNLOCAL, nameN[Uncategorized (Local)]
IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollbackENDDECLARE jobId BINARY(16)
EXEC ReturnCode msdb.dbo.sp_add_job job_nameNDIFF_BACKUP, enabled1, notify_level_eventlog0, notify_level_email0, notify_level_netsend0, notify_level_page0, delete_level0, descriptionN无描述。, category_nameN[Uncategorized (Local)], owner_login_nameNsa, job_id jobId OUTPUT
IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollback
/****** Object: Step [DIFF_STEP1] Script Date: 2016/9/30 12:13:19 ******/
EXEC ReturnCode msdb.dbo.sp_add_jobstep job_idjobId, step_nameNDIFF_STEP1, step_id1, cmdexec_success_code0, on_success_action1, on_success_step_id0, on_fail_action2, on_fail_step_id0, retry_attempts0, retry_interval0, os_run_priority0, subsystemNTSQL, commandN[dbo].[sp_BackupDatabase] D, database_nameNmaster, flags0
IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollback
EXEC ReturnCode msdb.dbo.sp_update_job job_id jobId, start_step_id 1
IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollback
EXEC ReturnCode msdb.dbo.sp_add_jobschedule job_idjobId, nameNEXERY_6h, enabled1, freq_type4, freq_interval1, freq_subday_type8, freq_subday_interval6, freq_relative_interval0, freq_recurrence_factor0, active_start_date20160930, active_end_date99991231, active_start_time0, active_end_time235959, schedule_uidNf7514c1b-128f-4ae4-8361-9dbcbbff66c6
IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollback
EXEC ReturnCode msdb.dbo.sp_add_jobserver job_id jobId, server_name N(local)
IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:IF (TRANCOUNT 0) ROLLBACK TRANSACTION
EndSave:GO数据一致性检查
-- Author: KK-- Create date: 2016-09-27-- Description: 数据库一致性检查每周运行及时发现数据库损坏-- 本脚本针对于中小型数据库当数据库达到一定规模超过T级或有大表使用计算列等可适当拆分或调整以免checkdb时间超过维护时间窗口而影响业务-- E:\checkdb_report.txt , 输出文件的路径检查出的错误信息或被记录进去或直接通过作业记录查看-- http://www.cnblogs.com/double-K/--需要备份的数据库未使用参数传递而是选择在存储过程中指定当添加新库时不需要修改任何脚本--脚本针对中小数据库,如果数据库超过1T甚至更大,CHECKDB也是必要操作,但需要拆分文件组或更精细化检查以降低每次检查的时间,保证在指定的维护窗口完成任务。USE [msdb]
GO/****** Object: Job [CHECKDB] Script Date: 09/30/2016 15:16:01 ******/
BEGIN TRANSACTION
DECLARE ReturnCode INT
SELECT ReturnCode 0
/****** Object: JobCategory [[Uncategorized (Local)]]] Script Date: 09/30/2016 15:16:01 ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE nameN[Uncategorized (Local)] AND category_class1)
BEGIN
EXEC ReturnCode msdb.dbo.sp_add_category classNJOB, typeNLOCAL, nameN[Uncategorized (Local)]
IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollbackENDDECLARE jobId BINARY(16)
EXEC ReturnCode msdb.dbo.sp_add_job job_nameNCHECKDB, enabled1, notify_level_eventlog0, notify_level_email0, notify_level_netsend0, notify_level_page0, delete_level0, descriptionN数据库一致性检查可以发现数据库是否有损坏。, category_nameN[Uncategorized (Local)], owner_login_nameNsa, job_id jobId OUTPUT
IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollback
/****** Object: Step [CHECKDB] Script Date: 09/30/2016 15:16:01 ******/
EXEC ReturnCode msdb.dbo.sp_add_jobstep job_idjobId, step_nameNCHECKDB, step_id1, cmdexec_success_code0, on_success_action1, on_success_step_id0, on_fail_action2, on_fail_step_id0, retry_attempts0, retry_interval0, os_run_priority0, subsystemNTSQL, commandN
declare db_info cursor for
SELECT NAME FROM MASTER.SYS.databases
where state 0 ---只处理online的数据库
and name not in (tempdb,ReportServerTempDB,ReportServer) ----填写不需要检查的数据库declare databaseName nvarchar(128)
declare recovery_model int
DECLARE sqlCommand NVARCHAR(1000)
OPEN db_info
fetch next from db_info into databaseName
while fetch_status0
Begin
SET sqlCommand DBCC CHECKDB(N databaseName ) WITH NO_INFOMSGS
print sqlCommandEXECUTE sp_executesql sqlCommand
fetch next from db_info into databaseName
End
close db_info
deallocate db_info , database_nameNmaster, output_file_nameNE:\checkdb_report.txt, --输出文件的路径检查出的错误信息或被记录进去或直接通过作业记录查看flags4
IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollback
EXEC ReturnCode msdb.dbo.sp_update_job job_id jobId, start_step_id 1
IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollback
EXEC ReturnCode msdb.dbo.sp_add_jobschedule job_idjobId, nameNsunday_2am, enabled1, freq_type8, freq_interval1, freq_subday_type1, freq_subday_interval0, freq_relative_interval0, freq_recurrence_factor1, active_start_date20160930, active_end_date99991231, active_start_time20000, active_end_time235959, schedule_uidN3ade533f-5ce1-434f-98ff-b4509b2ca582
IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollback
EXEC ReturnCode msdb.dbo.sp_add_jobserver job_id jobId, server_name N(local)
IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:IF (TRANCOUNT 0) ROLLBACK TRANSACTION
EndSave:GOAgent作业备份
备份作业可以通过备份MSDB完成但是保留一份脚本还是不错的脚本为存储过程建议一个周或一个月备份一次可使用JOB 调用存储过程。
USE [master]
GO/****** Object: StoredProcedure [dbo].[DumpJobsql] Script Date: 02/07/2014 11:38:46 ******/
SET ANSI_NULLS ON
GOSET QUOTED_IDENTIFIER ON
GOalter PROCEDURE [dbo].[usp_DumpJobsql]
AS
BEGIN-- Author: KK-- Create date: 2016-09-27-- Description: 备份JOB目前不支持邮件-- 生成数据一份保留在master的zzz_temp_JOB_bcp表中另外会在目标位置生成一个 job_日期.sql-- http://www.cnblogs.com/double-K/SET NOCOUNT ONDECLARE SV nvarchar(4)DECLARE i_enabled TINYINTDECLARE sql VARCHAR(max)DECLARE i_job_name VARCHAR(1000)DECLARE i_notify_level_eventlog INTDECLARE i_notify_level_email INTDECLARE i_notify_level_netsend INTDECLARE i_notify_level_page INTDECLARE i_delete_level INTDECLARE i_description VARCHAR(1000)DECLARE i_category_name VARCHAR(1000)DECLARE i_owner_login_name VARCHAR(1000)DECLARE i_category_class INTDECLARE i_start_step_id INT DECLARE i_step_name VARCHAR(1000) DECLARE i_step_id INT DECLARE i_cmdexec_success_code INT DECLARE i_on_success_action INT DECLARE i_on_success_step_id INT DECLARE i_on_fail_action INT DECLARE i_on_fail_step_id INT DECLARE i_retry_attempts BIGINT DECLARE i_retry_interval INT DECLARE i_os_run_priority INT DECLARE i_subsystem VARCHAR(1000) DECLARE i_command VARCHAR(8000)DECLARE i_database_name VARCHAR(100) DECLARE i_flags INT DECLARE i_class VARCHAR(10) ,i_type VARCHAR(10)DECLARE c_jobid UNIQUEIDENTIFIER ,c_categoryid INTDECLARE loop_stepid INTDECLARE m_stepid INT DECLARE loop_scheduleid INTDECLARE m_scheduleid INTDECLARE i_schedule_enabled TINYINTDECLARE i_freq_type INTDECLARE i_schedule_name VARCHAR(1000) DECLARE i_freq_interval INT DECLARE i_freq_subday_type INTDECLARE i_freq_subday_interval INTDECLARE i_freq_relative_interval INTDECLARE i_freq_recurrence_factor INTDECLARE i_active_start_date BIGINT DECLARE i_active_end_date BIGINT DECLARE i_active_start_time BIGINT DECLARE i_active_end_time BIGINT DECLARE i_schedule_uid VARCHAR(1000)SET i_class JOBSET i_type LOCALif exists (select 1 from sys.objects where name zzz_temp_JOB_bcp)begin delete from master..zzz_temp_JOB_bcpendelsebegin create table zzz_temp_JOB_bcp(name nvarchar(100),text nvarchar(max),sv nvarchar(4),Bak_date nvarchar(10))endDECLARE job CURSOR FOR SELECT a.job_id ,a.category_id,服务器XX as SV FROM msdb.dbo.sysjobs a , msdb.dbo.syscategories cWHERE a.category_id c.category_id AND c.name NOT LIKE %Database Maintenance% AND c.name NOT LIKE %REPL%AND c.name Log ShippingAND a.name syspolicy_purge_history----如果需要可多服务器备份--union all--select a.job_id ,a.category_id,服务器XXX --from --opendatasource(SQLOLEDB,Data SourceXX.XX.XX.XX;User IDXX;PasswordXX).msdb.dbo.sysjobs a,--opendatasource(SQLOLEDB,Data SourceXX.XX.XX.XX;User IDXX;PasswordXX).msdb.dbo.syscategories c--WHERE a.category_id c.category_id -- AND c.name NOT LIKE %Database Maintenance% -- AND c.name NOT LIKE %REPL%-- AND c.name Log Shipping-- AND a.name syspolicy_purge_historyOPEN jobFETCH job INTO c_jobid ,c_categoryid,SVWHILE FETCH_STATUS 0BEGINSET sql SELECT i_job_name a.name ,i_enabled [enabled] ,i_notify_level_eventlog notify_level_eventlog ,i_notify_level_email notify_level_email ,i_notify_level_netsend notify_level_netsend ,i_notify_level_page notify_level_page ,i_delete_level delete_level ,i_description [description] ,i_category_name c.name ,i_owner_login_name ISNULL(SUSER_SNAME(a.owner_sid), N) ,i_category_class category_class FROM msdb.dbo.sysjobs a ,msdb.dbo.syscategories cWHERE a.category_idc.category_id AND a.job_idc_jobid AND a.category_id c_categoryidSET sqlsqlCHAR(13)CHAR(10) USE [msdb]SET sqlsqlCHAR(13)CHAR(10) GOSET sqlsqlCHAR(13)CHAR(10) /****** Object: Job [ i_job_name ] Script Date: CONVERT(VARCHAR,GETDATE(),22) ******/ SET sqlsqlCHAR(13)CHAR(10) BEGIN TRANSACTION SET sqlsqlCHAR(13)CHAR(10) DECLARE ReturnCode INT SET sqlsqlCHAR(13)CHAR(10) SELECT ReturnCode 0SET sqlsqlCHAR(13)CHAR(10) /****** Object: JobCategory [ i_category_name ] Script Date: 08/20/2016 12:35:16 ******/SET sqlsqlCHAR(13)CHAR(10) IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE nameN i_category_name AND category_class CAST(i_category_class AS VARCHAR) ) SET sqlsqlCHAR(13)CHAR(10) BEGIN SET sqlsqlCHAR(13)CHAR(10) EXEC ReturnCode msdb.dbo.sp_add_category classN i_class , typeN i_type , nameN i_category_name SET sqlsqlCHAR(13)CHAR(10) IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollbackSET sqlsqlCHAR(13)CHAR(10) SET sqlsqlCHAR(13)CHAR(10) ENDSET sqlsqlCHAR(13)CHAR(10) SET sqlsqlCHAR(13)CHAR(10) DECLARE jobId BINARY(16) SET sqlsqlCHAR(13)CHAR(10) EXEC ReturnCode msdb.dbo.sp_add_job job_nameN i_job_name , SET sqlsqlCHAR(13)CHAR(10) enabled CAST(i_enabled AS VARCHAR) , SET sqlsqlCHAR(13)CHAR(10) notify_level_eventlog CAST(i_notify_level_eventlog AS VARCHAR) ,SET sqlsqlCHAR(13)CHAR(10) notify_level_email CAST(i_notify_level_email AS VARCHAR) , SET sqlsqlCHAR(13)CHAR(10) notify_level_netsend CAST(i_notify_level_netsend AS VARCHAR) , SET sqlsqlCHAR(13)CHAR(10) notify_level_page CAST(i_notify_level_page AS VARCHAR) , SET sqlsqlCHAR(13)CHAR(10) delete_level CAST(i_delete_level AS VARCHAR) , SET sqlsqlCHAR(13)CHAR(10) descriptionN i_description , SET sqlsqlCHAR(13)CHAR(10) category_nameN i_category_name , SET sqlsqlCHAR(13)CHAR(10) owner_login_nameN i_owner_login_name , job_id jobId OUTPUT SET sqlsqlCHAR(13)CHAR(10) IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollback IF EXISTS ( SELECT TOP 1 1 FROM msdb.dbo.sysjobsteps WHERE job_id c_jobid )BEGINSELECT loop_stepid MIN(step_id) ,m_stepid MAX(step_id) FROM msdb.dbo.sysjobsteps WHERE job_id c_jobid WHILE (loop_stepid m_stepid) BEGIN SELECT i_start_step_id start_step_id,i_step_name step_name ,i_step_id step_id,i_cmdexec_success_code cmdexec_success_code ,i_on_success_action on_success_action ,i_on_success_step_id on_success_step_id ,i_on_fail_action on_fail_action ,i_on_fail_step_id on_fail_step_id ,i_retry_attempts retry_attempts ,i_retry_interval retry_interval ,i_os_run_priority os_run_priority ,i_subsystem subsystem ,i_command command ,i_database_name database_name ,i_flags flagsFROM msdb.dbo.sysjobs a ,msdb.dbo.sysjobsteps b WHERE a.job_id b.job_id AND step_id loop_stepid AND a.job_id c_jobid SET sqlsqlCHAR(13)CHAR(10) /****** Object: Step [ i_step_name ] Script Date: CONVERT(VARCHAR,GETDATE(),22) ******/ SET sqlsqlCHAR(13)CHAR(10) EXEC ReturnCode msdb.dbo.sp_add_jobstep job_idjobId, step_nameN i_step_name ,SET sqlsqlCHAR(13)CHAR(10) step_id CAST(i_step_id AS VARCHAR) , SET sqlsqlCHAR(13)CHAR(10) cmdexec_success_code CAST(i_cmdexec_success_code AS VARCHAR) , SET sqlsqlCHAR(13)CHAR(10) on_success_action CAST(i_on_success_action AS VARCHAR) , SET sqlsqlCHAR(13)CHAR(10) on_success_step_id CAST(i_on_success_step_id AS VARCHAR) , SET sqlsqlCHAR(13)CHAR(10) on_fail_action CAST(i_on_fail_action AS VARCHAR) , SET sqlsqlCHAR(13)CHAR(10) on_fail_step_id CAST(i_on_fail_step_id AS VARCHAR) , SET sqlsqlCHAR(13)CHAR(10) retry_attempts CAST(i_retry_attempts AS VARCHAR) , SET sqlsqlCHAR(13)CHAR(10) retry_interval CAST(i_retry_interval AS VARCHAR) , SET sqlsqlCHAR(13)CHAR(10) os_run_priority CAST(i_os_run_priority AS VARCHAR) , subsystemN i_subsystem , SET sqlsqlCHAR(13)CHAR(10) ISNULL( commandN REPLACE(i_command , ,) , ,) SET sqlsqlCHAR(13)CHAR(10) ISNULL( database_nameN i_database_name , ,) SET sqlsqlCHAR(13)CHAR(10) flags CAST(i_flags AS VARCHAR) SET sqlsqlCHAR(13)CHAR(10) IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollback SET loop_stepid ( SELECT TOP 1 step_id FROM msdb.dbo.sysjobsteps WHERE job_id c_jobid AND step_id loop_stepid ORDER BY step_id )ENDENDSET sqlsqlCHAR(13)CHAR(10) EXEC ReturnCode msdb.dbo.sp_update_job job_id jobId, start_step_id CAST(i_start_step_id AS VARCHAR) SET sqlsqlCHAR(13)CHAR(10) IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollback IF EXISTS ( SELECT TOP 1 1 FROM msdb.dbo.sysschedules c ,msdb.dbo.sysjobschedules d WHERE c.schedule_id d.schedule_id AND job_id c_jobid )BEGINSELECT loop_scheduleid MIN(c.schedule_id) ,m_scheduleid MAX(c.schedule_id) FROM msdb.dbo.sysschedules c ,msdb.dbo.sysjobschedules dWHERE c.schedule_id d.schedule_id AND job_id c_jobid WHILE ( loop_scheduleid m_scheduleid ) BEGINSELECT i_schedule_enabled [enabled] ,i_freq_type freq_type ,i_schedule_name name,i_freq_interval freq_interval ,i_freq_subday_type freq_subday_type ,i_freq_subday_interval freq_subday_interval ,i_freq_relative_interval freq_relative_interval ,i_freq_recurrence_factor freq_recurrence_factor ,i_active_start_date active_start_date ,i_active_end_date active_end_date ,i_active_start_time active_start_time ,i_active_end_time active_end_time ,i_schedule_uid schedule_uid FROM msdb.dbo.sysschedules c LEFT JOIN msdb.dbo.sysjobschedules dON c.schedule_id d.schedule_id WHERE d.job_id c_jobid AND c.schedule_id loop_scheduleid SET sqlsqlCHAR(13)CHAR(10) EXEC ReturnCode msdb.dbo.sp_add_jobschedule job_idjobId, nameN i_schedule_name , SET sqlsqlCHAR(13)CHAR(10) enabled CAST(i_schedule_enabled AS VARCHAR) , SET sqlsqlCHAR(13)CHAR(10) freq_type CAST(i_freq_type AS VARCHAR) , SET sqlsqlCHAR(13)CHAR(10) freq_interval CAST(i_freq_interval AS VARCHAR) , SET sqlsqlCHAR(13)CHAR(10) freq_subday_type CAST(i_freq_subday_type AS VARCHAR) , SET sqlsqlCHAR(13)CHAR(10) freq_subday_interval CAST(i_freq_subday_interval AS VARCHAR) , SET sqlsqlCHAR(13)CHAR(10) freq_relative_interval CAST(i_freq_relative_interval AS VARCHAR) , SET sqlsqlCHAR(13)CHAR(10) freq_recurrence_factor CAST(i_freq_recurrence_factor AS VARCHAR) , SET sqlsqlCHAR(13)CHAR(10) active_start_date CAST(i_active_start_date AS VARCHAR) , SET sqlsqlCHAR(13)CHAR(10) active_end_date CAST(i_active_end_date AS VARCHAR) , SET sqlsqlCHAR(13)CHAR(10) active_start_time CAST(i_active_start_time AS VARCHAR) , SET sqlsqlCHAR(13)CHAR(10) active_end_time CAST(i_active_end_time AS VARCHAR) , SET sqlsqlCHAR(13)CHAR(10) schedule_uidN i_schedule_uid SET sqlsqlCHAR(13)CHAR(10) IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollback SET loop_scheduleid ( SELECT TOP 1 c.schedule_id FROM msdb.dbo.sysschedules c ,msdb.dbo.sysjobschedules dWHERE c.schedule_id d.schedule_id AND job_id c_jobid AND c.schedule_id loop_scheduleid ) ENDENDSET sqlsqlCHAR(13)CHAR(10) EXEC ReturnCode msdb.dbo.sp_add_jobserver job_id jobId, server_name N(local) SET sqlsqlCHAR(13)CHAR(10) IF (ERROR 0 OR ReturnCode 0) GOTO QuitWithRollback SET sqlsqlCHAR(13)CHAR(10) COMMIT TRANSACTION SET sqlsqlCHAR(13)CHAR(10) GOTO EndSave SET sqlsqlCHAR(13)CHAR(10) QuitWithRollback: SET sqlsqlCHAR(13)CHAR(10) IF (TRANCOUNT 0) ROLLBACK TRANSACTION SET sqlsqlCHAR(13)CHAR(10) EndSave: SET sqlsqlCHAR(13)CHAR(10) SET sqlsqlCHAR(13)CHAR(10) GOPRINT sqlinsert into master..zzz_temp_JOB_bcpSELECT i_job_name,sql,SV,CONVERT(nvarchar(10),getdate(),112)FETCH NEXT FROM job INTO c_jobid ,c_categoryid ,SVENDCLOSE jobDEALLOCATE jobdeclare a nvarchar(17),c nvarchar(1000),name nvarchar(100),d nvarchar(100)set a CONVERT (nvarchar(17),GETDATE(),112)set name F:\kk_backup\job_a.sqlset d del name set c bcp select text from master..zzz_temp_JOB_bcp where bak_date CONVERT(nvarchar(10),getdate(),112) queryout name -c -S服务名称 -Usa -Psa123456 print dprint cexec sp_configure show advanced options,1reconfigure with overrideexec sp_configure xp_cmdshell,1reconfigure with overrideEXEC master..xp_cmdshell dEXEC master..xp_cmdshell cexec sp_configure xp_cmdshell,0reconfigure with overrideexec sp_configure show advanced options,0reconfigure with overrideend
GO监控某个目录是否被更改
需求对一个目录比如/data/test进行监控当这个目录下文件或子目录出现变动如修改、创建、删除、更名等操作时就发送邮件 针对上面的需求编写shell脚本如下
[rootcentos6-vm01 opt]# vim file_monit.sh
#!/bin/bash
#此脚本用于检测linux系统重要文件是否被改动如果改动则用邮件报警
#建议用定时任务执行此脚本如每5分钟执行一次也可修改此脚本用于死循环检测
#Ver:1.0
#http://www.cnblogs.com/kevingrace#定义验证文件所在目录
FileDir/var/CheckFile#获取主机名或自己定义
HostName$(hostname)#定义邮件参数xmtp地址发送邮件帐号发送邮件密码接收邮件地址邮件主题邮件内容
Mail_Smtpsmtp.wangshibo.com
Mail_Usernoticewangshibo.com
Mail_Passnotice123
Mail_Fromnoticewangshibo.com
Mail_Towangshibowangshibo.com
Mail_Subject${HostName}:There are changes to system files
Mail_Conntent${HostName}:There are changes to system files#定义需要验证的文件目录。这里我监控的是/data/test目录
CheckDir(
/data/test
)#生成所定义需验证的文件样本日志函数
OldFile () {
for i in ${CheckDir[]}
do
/bin/find ${i} -type f |xargs md5sum ${FileDir}/old.log
done
}
NewFile () {
for i in ${CheckDir[]}
do
/bin/find ${i} -type f |xargs md5sum ${FileDir}/new.log
done
}#生成所定义文件新日志函数(注意后面发送邮件内容\n表示换行)
SendEMail () {
/usr/local/bin/sendEmail -f $Mail_From -t $Mail_To -s $Mail_Smtp -u $Mail_Subject -xu $Mail_User -xp $Mail_Pass -m $Mail_Conntent\n
}
if [ ! -d ${FileDir} ]
then
mkdir ${FileDir}
fi#假如验证文件目录不存在则创建
if [ ! -f ${FileDir}/old.log ]
then
OldFile
fi#假如没有安装sendEmail则安装
if [ ! -f /usr/local/bin/sendEmail ]
then
cd /usr/local/src/
wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz
tar -xf sendEmail-v1.56.tar.gz
cd sendEmail-v1.56
cp sendEmail /usr/local/bin
chmod 0755 /usr/local/bin/sendEmail
fi#生成新验证日志
NewFile#新验证日志与样本日志进行比较
/usr/bin/diff ${FileDir}/new.log ${FileDir}/old.log ${FileDir}/diff.log
Status$?#假如比较结果有变化则发送邮件报警
if [ ${Status} -ne 0 ]
then
Mail_Conntent$(grep ${FileDir}/diff.log |awk {print $3})
SendEMail
fi#清除新旧日志把比较结果进行备份
/bin/mv -f ${FileDir}/diff.log ${FileDir}/diff$(date %F__%T).log
cat /dev/null ${FileDir}/old.log
cat /dev/null ${FileDir}/new.log#重新生成样本日志
OldFile#删除目录内30天以前的比较结果备份文件
/bin/find ${FileDir} -type f -mtime 30 |xargs rm -f
确保本机能连上shell脚本中指定的smtp服务器的25好端口
[rootcentos6-vm01 opt]# telnet smtp.wangshibo.com 25
Trying 223.252.214.65...
Connected to smtp.wangshibo.com.
Escape character is ^].
220 icoremail.net Anti-spam GT for Coremail System (icoremail-gateway-smtp[20170531])下面开始测试
[rootcentos6-vm01 test]# cd /opt/
[rootcentos6-vm01 opt]# cd /data/test/
[rootcentos6-vm01 test]# ll
total 0
[rootcentos6-vm01 test]# mkdir haha
[rootcentos6-vm01 test]# echo 123456 haha/heihei
[rootcentos6-vm01 test]# ll
total 4
drwxr-xr-x. 2 root root 4096 Jan 10 01:42 haha
[rootcentos6-vm01 test]# echo abcdef test.txt
[rootcentos6-vm01 test]# ll
total 8
drwxr-xr-x. 2 root root 4096 Jan 10 01:42 haha
-rw-r--r--. 1 root root 7 Jan 10 01:42 test.txt执行监控脚本
[rootcentos6-vm01 test]# sh -x /opt/file_monit.sh注意当首次执行脚本的时候由于所监控的目录下的文件没有变动所以不会发送邮件查看对比后的日志
[rootcentos6-vm01 test]# ll -d /var/CheckFile/
drwxr-xr-x. 2 root root 4096 Jan 10 01:44 /var/CheckFile/
[rootcentos6-vm01 test]# ll /var/CheckFile/
total 4
-rw-r--r--. 1 root root 0 Jan 10 01:44 diff2018-01-10__01:44:30.log
-rw-r--r--. 1 root root 0 Jan 10 01:44 new.log
-rw-r--r--. 1 root root 166 Jan 10 01:44 old.log[rootcentos6-vm01 test]# cat /var/CheckFile/diff2018-01-10__01\:44\:30.log
[rootcentos6-vm01 test]# cat /var/CheckFile/new.log
[rootcentos6-vm01 test]# cat /var/CheckFile/old.log
237267ea7fefa88360c22ab6fd582d7e /data/test/.hhhh.swp
5ab557c937e38f15291c04b7e99544ad /data/test/test.txt
f447b20a7fcbf53a5d5be013ea0b15af /data/test/haha/heihei
现在开始对/data/test目录下的文件做下变动
[rootcentos6-vm01 test]# echo aaaaaa test.txt
[rootcentos6-vm01 test]# touch haha/bobo
[rootcentos6-vm01 test]# mkdir heihei
[rootcentos6-vm01 test]# ll
total 12
drwxr-xr-x. 2 root root 4096 Jan 10 01:47 haha
drwxr-xr-x. 2 root root 4096 Jan 10 01:47 heihei
-rw-r--r--. 1 root root 14 Jan 10 01:47 test.txt执行监控脚本
[rootcentos6-vm01 test]# sh -x /opt/file_monit.sh查看对比后的日志
[rootcentos6-vm01 test]# ll /var/CheckFile/
total 8
-rw-r--r--. 1 root root 0 Jan 10 01:44 diff2018-01-10__01:44:30.log
-rw-r--r--. 1 root root 179 Jan 10 01:47 diff2018-01-10__01:47:41.log
-rw-r--r--. 1 root root 0 Jan 10 01:47 new.log
-rw-r--r--. 1 root root 221 Jan 10 01:47 old.log
[rootcentos6-vm01 test]# cat /var/CheckFile/diff2018-01-10__01\:47\:41.log
2,3c24533551682ca49b2f9b1f2829bf3b29d /data/test/test.txtd41d8cd98f00b204e9800998ecf8427e /data/test/haha/bobo
---5ab557c937e38f15291c04b7e99544ad /data/test/test.txt[rootcentos6-vm01 test]# cat /var/CheckFile/old.log
237267ea7fefa88360c22ab6fd582d7e /data/test/.hhhh.swp
4533551682ca49b2f9b1f2829bf3b29d /data/test/test.txt
d41d8cd98f00b204e9800998ecf8427e /data/test/haha/bobo
f447b20a7fcbf53a5d5be013ea0b15af /data/test/haha/heihei通过上面的diff日志可以看到新变动的文件或子目录已经记录到日志里了。查看邮件就能看到/data/test目录下变动的文件或子目录信息了 通过crontab定时任务每5分钟执行一次检查
[rootcentos6-vm01 test]# crontab -e
*/5 * * * * /bin/bash -x /opt/file_monit.sh /dev/null 21以上脚本也可以用于检测linux系统重要文件是否被更改只需将检查的目录由脚本中的/data/test改为/etc即可
日志文件ERROR监控报警
即对日志文件中的error进行监控当日志文件中出现error关键字时即可报警grep -i error 不区分大小写进行搜索error关键字但是会将包含error大小写字符的单词搜索出来
1第一类日志
在每天的日志目录下生产的error日志此日志文件每天都会自动生成里面有没有error日志内容不一定日志内容写入不频繁日志文件比较小。 举例说明
[rootfk-databus01 ~]# ll /data/log/sedsb/20180628/DEJ_0001_error_20180628.0.log
-rw-rw-r-- 1 zquser zquser 63059 Jun 28 15:32 /data/log/sedsb/20180628/DEJ_0001_error_20180628.0.log采用sendemail发送告警邮件sendemail安装参考http://www.cnblogs.com/kevingrace/p/5961861.html监控脚本路径
[rootfk-databus01 ~]# cd /opt/log_error_script/
[rootfk-databus01 log_error_script]# ll
total 20
-rw-r--r-- 1 root root 3782 Jun 29 12:13 DEJ_0001_error.log
-rwxr-xr-x 1 root root 4274 Jun 29 11:38 prcc_log_error.sh
-rwxr-xr-x 1 root root 1142 Feb 13 10:51 sendemail.sh监控脚本内容
[rootfk-databus01 log_error_script]# cat prcc_log_error.sh
#!/bin/sh
ERROR_LOG/bin/ls /data/log/sedsb/$(date %Y%m%d)/DEJ_0001_error*
ERROR_NEW_LOG/opt/log_error_script/DEJ_0001_error.log
DATEdate %Y年%m月%d日%H时%M分%S秒
HOST/bin/hostname
IP/sbin/ifconfig|grep inet addr|grep Bcast|cut -d: -f2|awk -F {print $1}
ERROR_MESSAGE$(/bin/grep -A20 $(grep ERROR $ERROR_LOG|tail -1|awk {print $1,$2,$3,$4}) $ERROR_LOG)DIR/data/log/sedsb/$(date %Y%m%d)
FILE/data/log/sedsb/$(date %Y%m%d)/DEJ_0001_error_$(date %Y%m%d).0.logif [ ! -d $DIR ];then/bin/mkdir $DIR
fiif [ ! -f $FILE ];then/bin/touch $FILE
fi/bin/chown -R zquser.zquser $DIRsleep 3if [ ! -f $ERROR_NEW_LOG ];then
/bin/touch $ERROR_NEW_LOG
fiNUM1$(/bin/cat $ERROR_LOG|wc -l)
NUM2$(/bin/cat $ERROR_NEW_LOG|wc -l)if [ -f $ERROR_LOG ] [ $NUM1 -ne 0 ] [ $NUM2 -eq 0 ];then
/bin/bash /opt/log_error_script/sendemail.sh wangshibokevin.com 风控系统${HOSTNAME}机器prcc服务日志的error监控 告警主机${HOSTNAME} \n告警IP${IP} \n告警时间${DATE} \n告警等级严重抓紧解决啊 \n告警人员王士博 \n告警详情prcc服务日志中出现error了 \n告警日志文件${ERROR_LOG} \n当前状态: PROBLEM \n \nerror信息\n$ERROR_MESSAGE
/bin/cat $ERROR_LOG $ERROR_NEW_LOG
fi/usr/bin/cmp $ERROR_LOG $ERROR_NEW_LOG /dev/null 21
if [ $? -ne 0 ];then
/bin/bash /opt/log_error_script/sendemail.sh wangshibokevin.com 风控系统${HOSTNAME}机器prcc服务日志的error监控 告警主机${HOSTNAME} \n告警IP${IP} \n告警时间${DATE} \n告警等级严重抓紧解决啊 \n告警人员王士博 \n告警详情prcc服务日志中出现error了 \n告警日志文件${ERROR_LOG} \n当前状态: PROBLEM \n \nerror信息\n$ERROR_MESSAGE
/bin/cat $ERROR_LOG $ERROR_NEW_LOG
fi结合crontab进行定时监控(每15秒执行一次)
[rootfk-databus01 ~]# crontab -l
#监控pcrr日志的error
* * * * * /bin/bash -x /opt/log_error_script/prcc_log_error.sh /dev/null 21
* * * * * sleep 15;/bin/bash -x /opt/log_error_script/prcc_log_error.sh /dev/null 21
* * * * * sleep 30;/bin/bash -x /opt/log_error_script/prcc_log_error.sh /dev/null 21
* * * * * sleep 45;/bin/bash -x /opt/log_error_script/prcc_log_error.sh /dev/null 21
针对上面脚本中的某些变量说明
[rootfk-databus01 ~]# /bin/ls /data/log/sedsb/$(date %Y%m%d)/DEJ_0001_error*
/data/log/sedsb/20180629/DEJ_0001_error_20180629.0.log[rootfk-databus01 ~]# grep ERROR /data/log/sedsb/20180629/DEJ_0001_error_20180629.0.log
ERROR DEJ 2018-06-29 12:13:29.191 [pool-4-thread-10] n.s.p.r.thread.OuterCheThdInterface - cx201806291213288440016车300接口异常!
ERROR DEJ 2018-06-29 12:13:29.196 [nioEventLoopGroup-3-12] n.s.p.r.c.MessageControllerImpl - cx201806291213288440016:[rootfk-databus01 ~]# grep ERROR /data/log/sedsb/20180629/DEJ_0001_error_20180629.0.log |tail -1|awk {print $1,$2,$3,$4}
ERROR DEJ 2018-06-29 12:13:29.196[rootfk-databus01 ~]# /bin/grep -A20 $(grep ERROR /data/log/sedsb/20180629/DEJ_0001_error_20180629.0.log |tail -1|awk {print $1,$2,$3,$4}) /data/log/sedsb/20180629/DEJ_0001_error_20180629.0.log
ERROR DEJ 2018-06-29 12:13:29.196 [nioEventLoopGroup-3-12] n.s.p.r.c.MessageControllerImpl - cx201806291213288440016:
net.sinocredit.pre.rcc.utils.exception.OuterDataException: 外部数据:cheFixPrice:mile里程 is null;at net.sinocredit.pre.rcc.datafactory.OuterDataProcess.execute(OuterDataProcess.java:51)at net.sinocredit.pre.rcc.datafactory.OuterDataProcess.execute(OuterDataProcess.java:23)at net.sinocredit.pre.rcc.service.getOtherDataService.MessageServiceImpl.getOrderData(MessageServiceImpl.java:34)at net.sinocredit.pre.rcc.controller.MessageControllerImpl.divMessage(MessageControllerImpl.java:110)at net.sinocredit.pre.rcc.handler.ServerHandler.channelRead(ServerHandler.java:28)at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:373)at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:351)at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102)at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:373)at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:351)at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:293)at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:267)at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:373)at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:351)at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1334)at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:373)报警邮件效果如下
2第二类日志
此日志是固定文件日志内容写入频繁日志文件比较大。对于此文件的监控通过采用tail -1000方式获取日志文件的最新1000行的方式进行error监控 举例说明
[rootfk-zqjcweb01 ~]# ll /data/log/decision/decision.log
-rw-rw-r-- 1 zquser zquser 5108 Jun 28 16:02 /data/log/decision/decision.log采用sendemail发送告警邮件sendemail安装参考http://10.0.8.50/software/sendemail_install.sh监控脚本路径
[rootfk-zqjcweb01 ~]# cd /opt/log_error_script/
[rootfk-zqjcweb01 log_error_script]# ls
decision sendemail.sh
[rootfk-zqjcweb01 log_error_script]# ls decision/
decision.log_diff_error.log decision.log_error.log decision.log_monit.sh脚本内容
[rootfk-zqjcweb01 log_error_script]# cat decision/decision.log_monit.sh
#!/bin/sh
ERROR_LOG/data/log/decision/decision.log
ERROR_NEW_LOG/opt/log_error_script/decision/decision.log_error.log
ERROR_DIFF_LOG/opt/log_error_script/decision/decision.log_diff_error.log
DATEdate %Y年%m月%d日%H时%M分%S秒
HOST/bin/hostname
IP/sbin/ifconfig|grep inet addr|grep Bcast|cut -d: -f2|awk -F {print $1}if [ ! -f $ERROR_NEW_LOG ];then
/bin/touch $ERROR_NEW_LOG
fiNUM1$(/usr/bin/tail -1000 $ERROR_LOG|grep error|wc -l)
NUM2$(/bin/cat $ERROR_NEW_LOG|wc -l)if [ -f $ERROR_LOG ] [ $NUM1 -ne 0 ] [ $NUM2 -eq 0 ];then
/bin/bash /opt/log_error_script/sendemail.sh wangshibokevin.com 风控系统${HOSTNAME}机器的decision.log日志中的error监控 告警主机${HOSTNAME} \n告警IP${IP} \n告警时间${DATE} \n告警等级严重抓紧解决啊 \n告警人员王士博 \n告警详情decision.log日志中出现error了 \n告警日志文件${ERROR_LOG} \n当前状态: PROBLEM
/usr/bin/tail -1000 $ERROR_LOG|grep error $ERROR_NEW_LOG
fi/usr/bin/tail -1000 $ERROR_LOG|grep error $ERROR_DIFF_LOG
/usr/bin/cmp $ERROR_DIFF_LOG $ERROR_NEW_LOG /dev/null 21
if [ $? -ne 0 ];then
/bin/bash /opt/log_error_script/sendemail.sh wangshibokevin.com 风控系统${HOSTNAME}机器的decision.log日志中的error监控 告警主机${HOSTNAME} \n告警IP${IP} \n告警时间${DATE} \n告警等级严重抓紧解决啊 \n告警人员王士博 \n告警详情decision.log日志中出现error了 \n告警日志文件${ERROR_LOG} \n当前状态: PROBLEM
/usr/bin/tail -1000 $ERROR_LOG|grep error $ERROR_NEW_LOG
fi
You have new mail in /var/spool/mail/root结合crontab进行定时监控
[rootfk-zqjcweb01 log_error_script]# crontab -l
#decision.log日志的error监控
* * * * * /bin/bash -x /opt/log_error_script/decision/decision.log_monit.sh /dev/null 21
* * * * * sleep 15;/bin/bash -x /opt/log_error_script/decision/decision.log_monit.sh /dev/null 21
* * * * * sleep 30;/bin/bash -x /opt/log_error_script/decision/decision.log_monit.sh /dev/null 21
* * * * * sleep 45;/bin/bash -x /opt/log_error_script/decision/decision.log_monit.sh /dev/null 21上面提到的sendemail.sh邮件发送脚本
[rootfk-zqjcweb01 ~]# cat /opt/log_error_script/sendemail.sh
#!/bin/bash
# Filename: SendEmail.sh
# Notes: 使用sendEmail
#
# 脚本的日志文件
LOGFILE/tmp/Email.log
:$LOGFILE
exec 1$LOGFILE
exec 21
SMTP_serversmtp.kevin.com
usernamemonitkevin.com
passwordmonit123
from_email_addressmonitkevin.com
to_email_address$1
message_subject_utf8$2
message_body_utf8$3
# 转换邮件标题为GB2312解决邮件标题含有中文收到邮件显示乱码的问题。
message_subject_gb2312iconv -t GB2312 -f UTF-8 EOF
$message_subject_utf8
EOF
[ $? -eq 0 ] message_subject$message_subject_gb2312 || message_subject$message_subject_utf8
# 转换邮件内容为GB2312解决收到邮件内容乱码
message_body_gb2312iconv -t GB2312 -f UTF-8 EOF
$message_body_utf8
EOF
[ $? -eq 0 ] message_body$message_body_gb2312 || message_body$message_body_utf8
# 发送邮件
sendEmail/usr/local/bin/sendEmail
set -x
$sendEmail -s $SMTP_server -xu $username -xp $password -f $from_email_address -t $to_email_address -u $message_subject -m $message_body -o message-content-typetext -o message-charsetgb23123第三类日志
日志规则说明
在etl服务器下的EXP、MDB、MID、ODB、PDB、PUS、SDB系统里有很多任务日志日志都存放在当天的日期目录下。现在需要对这些任务日志的error进行监控当出现error报错信息时立刻发出报警当这些任务日志文件里有出现error报错信息的那么该任务日志文件就不会被写入了。也就是说一个任务日志文件只会出现一次error报错。出现error报错信息的任务日志不能删除和更改因为这些任务日志会被其他程序调用展示。
[rootbigdata-etl01 ~]# ll /data/etluser/LOG/
drwxrwx--- 33 etluser etluser 4096 Jul 6 02:00 EXP
drwxrwx--- 33 etluser etluser 4096 Jul 6 02:00 MDB
drwxrwx--- 33 etluser etluser 4096 Jul 6 02:00 MID
drwxrwx--- 33 etluser etluser 4096 Jul 6 02:00 ODB
drwxrwx--- 33 etluser etluser 4096 Jul 6 02:00 PDB
drwxrwx--- 32 etluser etluser 4096 Jul 6 00:47 PUS
drwxrwx--- 33 etluser etluser 4096 Jul 6 02:00 SDB
[rootbigdata-etl01 ~]# ls /data/etluser/LOG/EXP/
20180606 20180609 20180612 20180615 20180618 20180621 20180624 20180627 20180630 20180703 20180706
20180607 20180610 20180613 20180616 20180619 20180622 20180625 20180628 20180701 20180704
20180608 20180611 20180614 20180617 20180620 20180623 20180626 20180629 20180702 20180705
[rootbigdata-etl01 ~]# ls /data/etluser/LOG/EXP/20180706/
EXP_EXP_V_CUST_CRDT_SITU_20180705[1][1].54.log exp_v_opr_size_curr_stats_0010601[1].pl.56.log
EXP_EXP_V_DAILY_BIZ_AMT_SITU_20180705[1][1].45.log exp_v_opr_size_curr_stats_0010602[1].pl.56.log
EXP_EXP_V_MATR_RMND_INTFC_QG6_001_20180705[1][1].83.log exp_v_prvs_provs_int_intfc_f0_0010600[1].pl.103.log
EXP_EXP_V_OPR_SIZE_CURR_STATS_001_20180705[1][1].56.log exp_v_prvs_provs_int_intfc_f0_0010601[1].pl.103.log
EXP_EXP_V_PRVS_PROVS_INT_INTFC_F0_001_20180705[1][1].103.log exp_v_prvs_provs_int_intfc_f0_0020600[1].pl.98.log
EXP_EXP_V_PRVS_PROVS_INT_INTFC_F0_002_20180705[1][1].98.log exp_v_prvs_provs_int_intfc_f0_0020601[1].pl.98.log
EXP_EXP_V_PRVS_PROVS_INT_INTFC_F0_003_20180705[1][1].90.log exp_v_prvs_provs_int_intfc_f0_0030600[1].pl.90.log
EXP_EXP_V_PRVS_PROVS_INT_INTFC_F0_007_20180705[1][1].48.log exp_v_prvs_provs_int_intfc_f0_0030601[1].pl.90.log
EXP_EXP_V_PRVS_PROVS_INT_INTFC_F0_008_20180705[1][1].78.log exp_v_prvs_provs_int_intfc_f0_0070600[1].pl.48.log
EXP_EXP_V_PRVS_PROVS_INT_INTFC_F0_009_20180705[1][1].15.log exp_v_prvs_provs_int_intfc_f0_0070601[1].pl.48.log
EXP_EXP_V_PRVS_PROVS_INT_INTFC_F0_010_20180705[1][1].48.log exp_v_prvs_provs_int_intfc_f0_0080600[1].pl.78.log
EXP_EXP_V_PRVS_PROVS_INT_INTFC_F1_004_20180705[1][1].16.log exp_v_prvs_provs_int_intfc_f0_0080601[1].pl.78.log
EXP_EXP_V_PRVS_PROVS_INT_INTFC_F1_006_20180705[1][1].8.log exp_v_prvs_provs_int_intfc_f0_0090600[1].pl.15.log
EXP_EXP_V_QRY_FACT_AGT_INTFC_20180705[1][1].47.log exp_v_prvs_provs_int_intfc_f0_0090601[1].pl.15.log
exp_v_cust_crdt_situ0600[1].pl.54.log exp_v_prvs_provs_int_intfc_f0_0100600[1].pl.48.log
exp_v_cust_crdt_situ0601[1].pl.54.log exp_v_prvs_provs_int_intfc_f0_0100601[1].pl.48.log
exp_v_cust_crdt_situ0602[1].pl.54.log exp_v_prvs_provs_int_intfc_f1_0040600[1].pl.16.log
exp_v_daily_biz_amt_situ0600[1].pl.45.log exp_v_prvs_provs_int_intfc_f1_0040601[1].pl.16.log
exp_v_daily_biz_amt_situ0601[1].pl.45.log exp_v_prvs_provs_int_intfc_f1_0060600[1].pl.8.log
exp_v_daily_biz_amt_situ0602[1].pl.45.log exp_v_prvs_provs_int_intfc_f1_0060601[1].pl.8.log
exp_v_matr_rmnd_intfc_qg6_0010600[1].pl.83.log exp_v_qry_fact_agt_intfc0600[1].pl.47.log
exp_v_matr_rmnd_intfc_qg6_0010601[1].pl.83.log exp_v_qry_fact_agt_intfc0601[1].pl.47.log
exp_v_matr_rmnd_intfc_qg6_0010602[1].pl.83.log exp_v_qry_fact_agt_intfc0602[1].pl.47.log
exp_v_opr_size_curr_stats_0010600[1].pl.56.log监控脚本思路
1对这些任务日志进行批量搜索error关键字(不区分大小写)
2将出现error关键字的任务日志拷贝到一个专门的目录下error日志文件的列表目录。
3对搜索到error关键字的任务日志做判断判断它是否存在于那个列表目录下如果不存在说明是新出现error的日志文件就立刻报警如果存在说明出现的error是之前的信息不报警监控脚本编写情况如下
error_log为error日志文件的列表目录
sendemail.sh为邮件发送脚本上面介绍过
[rootbigdata-etl01 log_error_script]# ls
EXP MDB MID ODB PDB PUS SDB sendemail.sh
[rootbigdata-etl01 log_error_script]# ls EXP/
error_log EXP_error_monit.sh
[rootbigdata-etl01 log_error_script]# ls MDB/
error_log MDB_error_monit.sh
[rootbigdata-etl01 log_error_script]# ls MID/
error_log MID_error_monit.sh
[rootbigdata-etl01 log_error_script]# ls ODB/
error_log ODB_error_monit.sh
[rootbigdata-etl01 log_error_script]# ls PDB/
error_log PDB_error_monit.sh
[rootbigdata-etl01 log_error_script]# ls PUS/
error_log PUS_error_monit.sh
[rootbigdata-etl01 log_error_script]# ls SDB/
error_log SDB_error_monit.sh
[rootbigdata-etl01 log_error_script]#这里贴出SDB系统的任务日志的error监控报警脚本其他几个系统的监控脚本与这个一样只需要将脚本中的SDB替换成对应的系统名称即可
[rootbigdata-etl01 log_error_script]# cat /opt/log_error_script/SDB/SDB_error_monit.sh
#!/bin/sh
DATE_DIR$(date %Y%m%d)
DATEdate %Y年%m月%d日%H时%M分%S秒
HOST/bin/hostname
IP/sbin/ifconfig|grep inet addr|grep Bcast|cut -d: -f2|awk -F {print $1}cd /data/etluser/LOG/SDB
if [ ! -d $DATE_DIR ];then
/bin/mkdir $DATE_DIR
/bin/chown -R etluser.etluser $DATE_DIR
ficd /data/etluser/LOG/SDB/$DATE_DIR
for FILE in $(/bin/ls *.log)
doNUM$(/bin/grep -i error /data/etluser/LOG/SDB/$DATE_DIR/$FILE|wc -l)ERROR_MESSAGE$(/bin/grep -i error /data/etluser/LOG/SDB/$DATE_DIR/$FILE)if [ $NUM -ne 0 ];then/bin/ls /opt/log_error_script/SDB/error_log/$FILEa$?if [ $a -ne 0 ];then/opt/log_error_script/sendemail.sh wangshibotest.com 大数据平台etl服务器${HOSTNAME}的SDB任务日志里出现error了 告警主机${HOSTNAME} \n告警IP${IP} \n告警时间${DATE} \n告警等级严重 \n告警人员王士博 \n告警详情SDB的任务日志里出现error了抓紧解决啊 \n当前状态: PROBLEM \n告警日志文件/data/etluser/LOG/SDB/$DATE_DIR/$FILE \n\n\n------请看下面error报错信息------- \nerror信息\n$ERROR_MESSAGEcp /data/etluser/LOG/SDB/$DATE_DIR/$FILE /opt/log_error_script/SDB/error_log/elseecho $FILE日志中error报错信息是之前发生的无需报警!fielseecho $FILE 日志里没有error报错啦fi
done给脚本赋予执行权限
[rootbigdata-etl01 log_error_script]# chmod 755 /opt/log_error_script/SDB/SDB_error_monit.sh
[rootbigdata-etl01 log_error_script]# sh /opt/log_error_script/SDB/SDB_error_monit.sh
qbl_biz_cst_bsc_inf0100[1].pl.73.log 日志里没有error报错啦
qbl_biz_cst_bsc_inf0101[1].pl.73.log 日志里没有error报错啦
qbl_biz_fnc_bsc_inf0100[1].pl.73.log 日志里没有error报错啦
qbl_biz_fnc_bsc_inf0101[1].pl.73.log 日志里没有error报错啦
qbl_biz_fnc_mod_inf0100[1].pl.73.log 日志里没有error报错啦
qbl_biz_fnc_mod_inf0101[1].pl.73.log 日志里没有error报错啦
qbl_biz_pd_bsc_inf0100[1].pl.73.log 日志里没有error报错啦
qbl_biz_pd_bsc_inf0101[1].pl.73.log 日志里没有error报错啦
qbl_biz_pre_ctr_bsc_inf0100[1].pl.73.log 日志里没有error报错啦
qbl_biz_pre_ctr_bsc_inf0101[1].pl.73.log 日志里没有error报错啦
qbl_biz_repy_base_inf0100[1].pl.73.log 日志里没有error报错啦
qbl_biz_repy_base_inf0101[1].pl.73.log 日志里没有error报错啦
qbl_biz_repy_pl_dtl0100[1].pl.78.log 日志里没有error报错啦
qbl_biz_repy_pl_dtl0101[1].pl.78.log 日志里没有error报错啦
qbl_biz_repy_pl_inf0100[1].pl.78.log 日志里没有error报错啦
qbl_biz_repy_pl_inf0101[1].pl.78.log 日志里没有error报错啦
qbl_biz_repy_rcrd_jrnl0100[1].pl.73.log 日志里没有error报错啦
qbl_biz_repy_rcrd_jrnl0101[1].pl.73.log 日志里没有error报错啦
.......
.......结合crontab指定脚本定时执行任务每30秒执行一次
[rootbigdata-etl01 ~]# crontab -l
#etl相关任务日志的error监控报警
* * * * * /bin/bash -x /opt/log_error_script/EXP/EXP_error_monit.sh /dev/null 21
* * * * * sleep 30;/bin/bash -x /opt/log_error_script/EXP/EXP_error_monit.sh /dev/null 21* * * * * /bin/bash -x /opt/log_error_script/MDB/MDB_error_monit.sh /dev/null 21
* * * * * sleep 30;/bin/bash -x /opt/log_error_script/MDB/MDB_error_monit.sh /dev/null 21* * * * * /bin/bash -x /opt/log_error_script/MID/MID_error_monit.sh /dev/null 21
* * * * * sleep 30;/bin/bash -x /opt/log_error_script/MID/MID_error_monit.sh /dev/null 21* * * * * /bin/bash -x /opt/log_error_script/ODB/ODB_error_monit.sh /dev/null 21
* * * * * sleep 30;/bin/bash -x /opt/log_error_script/ODB/ODB_error_monit.sh /dev/null 21* * * * * /bin/bash -x /opt/log_error_script/PDB/PDB_error_monit.sh /dev/null 21
* * * * * sleep 30;/bin/bash -x /opt/log_error_script/PDB/PDB_error_monit.sh /dev/null 21* * * * * /bin/bash -x /opt/log_error_script/PUS/PUS_error_monit.sh /dev/null 21
* * * * * sleep 30;/bin/bash -x /opt/log_error_script/PUS/PUS_error_monit.sh /dev/null 21* * * * * /bin/bash -x /opt/log_error_script/SDB/SDB_error_monit.sh /dev/null 21
* * * * * sleep 30;/bin/bash -x /opt/log_error_script/SDB/SDB_error_monit.sh /dev/null 21邮件报警效果如下 如上可以看出SDB系统的任务日志里发现了error信息现在去日志列表目录里查看下发现出现error信息的任务日志已经拷贝到列表目录里了。 当下次脚本执行搜索到这些日志发现error时就会去做判断判断这些日志是否存在列表目录里如果出现就不会再次发出报警。
[rootbigdata-etl01 ~]# ll /opt/log_error_script/SDB/error_log/
total 12
-rw-r--r-- 1 root root 1978 Jul 6 10:36 SDB_QCX_CUSTOMER_INFO_20180705[1][1].73.log
-rw-r--r-- 1 root root 1939 Jul 6 10:19 SDB_QCX_FTTYPE_STC_20180705[1][1].51.log
-rw-r--r-- 1 root root 1939 Jul 6 10:19 SDB_QCX_SETTLE_STC_20180705[1][1].17.log基于Ping和Telnet/NC的监控脚本案例分析
通过shell脚本判断172.16.60.0/24网络里当前在线的ip有哪些能ping通则认为在线。
[rootpython2 ~]# cat /tmp/ip.sh
#!/bin/bashfor i in $(seq 1 254) #这一行或者换成for i in {1..254}
doIP172.16.60.${i}ping -c2 ${IP} /dev/null 21if [ $? 0 ];thenecho ${IP} is online!elseecho ${IP} is failedfi
done执行脚本
[rootpython2 ~]# sh /tmp/ip.sh
172.16.60.1 is online!
172.16.60.2 is failed
172.16.60.3 is failed
172.16.60.4 is failed
......案例一单纯地对某些ip进行ping监控
[roottest opt]# cat /opt/hosts_ip_list
192.168.10.10
192.168.10.11
192.168.10.12
192.168.10.13
192.168.10.14
192.168.10.15
192.168.10.16
192.168.10.17[roottest opt]# cat /opt/hosts_ip_monit.sh
#!/bin/bash
for ip in $(cat /opt/hosts_ip_list) doping -c 1 $ip /dev/null #ping 3次当3次ping都失败时则判定此ip网络通信失败。a$?sleep 2ping -c 1 $ip /dev/nullb$?sleep 2ping -c 1 $ip /dev/nullc$?sleep 2DATE$(date %F %H:%M)if [ $a -ne 0 -a $b -ne 0 -a $c -ne 0 ];thenecho -e Date : $DATE\nHost : $ip\nProblem : Ping is failed./bin/sed -i s/^$ip/#$ip/g /etc/hostselseecho $ip ping is successful./bin/sed -i s/^#$ip/$ip/g /etc/hostsfi
done[roottest opt]# chmod 755 /opt/hosts_ip_monit.sh[roottest opt]# sh /opt/hosts_ip_monit.sh
Date : 2018-04-24 15:49
Host : 192.168.10.10
Problem : Ping is failed.
Date : 2018-04-24 15:50
Host : 192.168.10.11
Problem : Ping is failed.
192.168.10.12 ping is successful.
192.168.10.13 ping is successful.
192.168.10.14 ping is successful.
192.168.10.15 ping is successful.
192.168.10.16 ping is successful.
Date : 2018-04-24 15:51
Host : 192.168.10.17
Problem : Ping is failed.案例二对/etc/hosts列表里的ip映射关系进行ping监控报警
测试系统服务器需要访问域名www.test.com该域名解析的DNS地址有很多个需要在测试系统服务器上的做host绑定。在/etc/hosts文件了做了www.test.com域名的很多绑定
在域名解析时会从host绑定配置里从上到下匹配如果上面绑定的ip不通则域名解析就会失败不会主动去解析到下一个绑定的地址除非将这个不通的ip绑定注释掉或删除掉。现在要求
当/etc/hosts文件里绑定的ip出现故障ping不通的时候将该ip的绑定自动注释并发出邮件报警如果该ip恢复了正常通信将自动打开该ip的绑定设置。[rootcx-app01 ~]# cat /etc/hosts
#192.168.10.10 www.test.com
#192.168.10.11 www.test.com
192.168.10.12 www.test.com
192.168.10.13 www.test.com
192.168.10.14 www.test.com
192.168.10.15 www.test.com
192.168.10.16 www.test.com
#192.168.10.17 www.test.com[rootcx-app01 ~]# ping www.test.com
PING www.test.com (192.168.10.12) 56(84) bytes of data.
64 bytes from www.test.com (192.168.10.12): icmp_seq1 ttl50 time31.1 ms
64 bytes from www.test.com (192.168.10.12): icmp_seq2 ttl50 time30.7 ms
64 bytes from www.test.com (192.168.10.12): icmp_seq3 ttl50 time30.8 ms
.......[rootcx-app01 ~]# cat /opt/hosts_ip_list
192.168.10.10
192.168.10.11
192.168.10.12
192.168.10.13
192.168.10.14
192.168.10.15
192.168.10.16
192.168.10.17[rootcx-app01 ~]# cat /opt/hosts_ip_monit.sh
#!/bin/bash
for ip in $(cat /opt/hosts_ip_list) doping -c 1 $ip /dev/null a$?sleep 2ping -c 1 $ip /dev/nullb$?sleep 2ping -c 1 $ip /dev/nullc$?sleep 2DATE$(date %F %H:%M)if [ $a -ne 0 -a $b -ne 0 -a $c -ne 0 ];thenecho -e Date : $DATE\nHost : $ip\nProblem : Ping is failed.cat /etc/hosts|grep ^#$ipd$?if [ $d -ne 0 ];then/bin/bash /opt/sendemail.sh zhangsantest.com 测试系统跟www.test.com通信情况 $HOSTNAME跟$ip连接失败现已在/etc/hosts文件里注释掉该ip的映射关系/bin/bash /opt/sendemail.sh lisitest.com 测试系统跟www.test.com通信情况 $HOSTNAME跟$ip连接失败现已在/etc/hosts文件里注释掉该ip的映射关系/bin/bash /opt/sendemail.sh liuwutest.com 测试系统跟www.test.com通信情况 $HOSTNAME跟$ip连接失败现已在/etc/hosts文件里注释掉该ip的映射关系/bin/sed -i s/^$ip/#$ip/g /etc/hostselseecho $ip is not connetedand it has been donefielseecho $ip ping is successful.cat /etc/hosts|grep ^#$ipf$?if [ $f -eq 0 ];then/bin/bash /opt/sendemail.sh zhangsantest.com 测试系统跟www.test.com通信情况 $HOSTNAME跟$ip连接成功现已在/etc/hosts文件里恢复该ip的映射关系/bin/bash /opt/sendemail.sh lisitest.com 测试系统跟www.test.com通信情况 $HOSTNAME跟$ip连接成功现已在/etc/hosts文件里恢复该ip的映射关系/bin/bash /opt/sendemail.sh liuwutest.com 测试系统跟www.test.com通信情况 $HOSTNAME跟$ip连接成功现已在/etc/hosts文件里恢复该ip的映射关系/bin/sed -i s/^#$ip/$ip/g /etc/hostselseecho $ip connection has been restoredfifi
done采用sendemail进行邮件告警发送sendemail部署参考http://www.cnblogs.com/kevingrace/p/5961861.html
[rootcx-app01 ~]# cat /opt/sendemail.sh
#!/bin/bash
# Filename: SendEmail.sh
# Notes: 使用sendEmail
#
# 脚本的日志文件
LOGFILE/tmp/Email.log
:$LOGFILE
exec 1$LOGFILE
exec 21
SMTP_serversmtp.test.com
usernamemonittest.com
passwordmonit123
from_email_addressmonittest.com
to_email_address$1
message_subject_utf8$2
message_body_utf8$3
# 转换邮件标题为GB2312解决邮件标题含有中文收到邮件显示乱码的问题。
message_subject_gb2312iconv -t GB2312 -f UTF-8 EOF
$message_subject_utf8
EOF
[ $? -eq 0 ] message_subject$message_subject_gb2312 || message_subject$message_subject_utf8
# 转换邮件内容为GB2312解决收到邮件内容乱码
message_body_gb2312iconv -t GB2312 -f UTF-8 EOF
$message_body_utf8
EOF
[ $? -eq 0 ] message_body$message_body_gb2312 || message_body$message_body_utf8
# 发送邮件
sendEmail/usr/local/bin/sendEmail
set -x
$sendEmail -s $SMTP_server -xu $username -xp $password -f $from_email_address -t $to_email_address -u $message_subject -m $message_body -o message-content-typetext -o message-charsetgb2312每10分钟定时执行该监控脚本
[rootcx-app01 ~]# crontab -l
*/10 * * * * /bin/bash -x /opt/hosts_ip_monit.sh /dev/null 21案例三通过nc工具对/etc/hosts列表里的ip的443端口跟本机通信是否正常进行探测
案例二是针对ping编写的监控脚本下面介绍下利用nc探测端口通信是否正常的脚本探测本机对下面/etc/hosts文件里的ip地址的443端口通信是否正常如果通信失败则发出报警并在/etc/hosts文件里注释掉该ip地址的绑定关系。
如果注释掉的ip的443端口跟本机恢复了通信则去掉/etc/hosts文件里该ip的注释[rootcx-app01 ~]# cat /etc/hosts
192.168.10.201 www.test.com
192.168.10.205 www.test.com
192.168.10.17 www.test.com
192.168.10.85 www.test.com
192.168.10.176 www.test.com
192.168.10.245 www.test.com
192.168.10.25 www.test.com
192.168.10.47 www.test.com[rootcx-app01 ~]# cat /opt/hosts_ip_list
192.168.10.201
192.168.10.205
192.168.10.17
192.168.10.85
192.168.10.176
192.168.10.245
192.168.10.25
192.168.10.47采用nc工具去探测端口是否正常通信yum install -y nc
[rootcx-app01 ~]# /usr/bin/nc -z -w 10 192.168.10.201 443
Connection to 192.168.10.201 443 port [tcp/https] succeeded!针对上面ip列表里的地址进行批量ip的443端口通信的探测。脚本如下
[rootcx-app01 ~]# cat /opt/host_ip_nc_monit.sh
#!/bin/bash
for ip in $(cat /opt/hosts_ip_list)
doecho -e Date : $DATE\nHost : $ip\nProblem : Port 443 is connected.cat /etc/hosts|grep ^#$ipa$?if [ $a -ne 0 ];then/usr/bin/nc -z -w 10 $ip 443b$?if [ $b -ne 0 ];then/bin/bash /opt/sendemail.sh wangshibotest.com 测试系统跟www.test.com通信情况 $HOSTNAME跟$ip的443端口连接失败现已在/etc/hosts文件里注释掉该ip的映射关系/bin/bash /opt/sendemail.sh linantest.com 测试系统跟www.test.com通信情况 $HOSTNAME跟$ip的443端口连接失败现已在/etc/hosts文件里注释掉该ip的映射关系/bin/sed -i s/^$ip/#$ip/g /etc/hostselseecho $HOSTNAME跟$ip的443端口正常连接fielse/usr/bin/nc -z -w 10 $ip 443c$?if [ $c -eq 0 ];then/bin/bash /opt/sendemail.sh wangshibotest.com 测试系统跟www.test.com通信情况 $HOSTNAME跟$ip的443端口连接成功现已在/etc/hosts文件里恢复该ip的映射关系/bin/bash /opt/sendemail.sh linantest.com 测试系统跟www.test.com通信情况 $HOSTNAME跟$ip的443端口连接成功现已在/etc/hosts文件里恢复该ip的映射关系/bin/sed -i s/^#$ip/$ip/g /etc/hostselseecho $HOSTNAME跟$ip的443端口连接失败fifi
done给脚本赋权
[rootcx-app01 ~]# chmod 755 /opt/host_ip_nc_monit.sh执行脚本
[rootcx-app01 ~]# sh /opt/host_ip_nc_monit.sh
Date :
Host : 192.168.10.201
Problem : Port 443 is connected.
Connection to 192.168.10.201 443 port [tcp/https] succeeded!
cx-app01.veredholdings.cn跟192.168.10.201的443端口正常连接
Date :
Host : 192.168.10.205
Problem : Port 443 is connected.
Connection to 192.168.10.205 443 port [tcp/https] succeeded!
cx-app01.veredholdings.cn跟192.168.10.205的443端口正常连接
Date :
Host : 192.168.10.17
Problem : Port 443 is connected.
Connection to 192.168.10.17 443 port [tcp/https] succeeded!
cx-app01.veredholdings.cn跟192.168.10.17的443端口正常连接
Date :
Host : 192.168.10.85
Problem : Port 443 is connected.
Connection to 192.168.10.85 443 port [tcp/https] succeeded!
cx-app01.veredholdings.cn跟192.168.10.85的443端口正常连接
Date :
Host : 192.168.10.176
Problem : Port 443 is connected.
Connection to 192.168.10.176 443 port [tcp/https] succeeded!
cx-app01.veredholdings.cn跟192.168.10.176的443端口正常连接
Date :
Host : 192.168.10.245
Problem : Port 443 is connected.
Connection to 192.168.10.245 443 port [tcp/https] succeeded!
cx-app01.veredholdings.cn跟192.168.10.245的443端口正常连接
Date :
Host : 192.168.10.25
Problem : Port 443 is connected.
Connection to 192.168.10.25 443 port [tcp/https] succeeded!
cx-app01.veredholdings.cn跟192.168.10.25的443端口正常连接
Date :
Host : 192.168.10.47
Problem : Port 443 is connected.
Connection to 192.168.10.47 443 port [tcp/https] succeeded!
cx-app01.veredholdings.cn跟192.168.10.47的443端口正常连接结合crontab进行计划任务
[rootcx-app01 ~]# crontab -l
*/10 * * * * /bin/bash -x /opt/host_ip_nc_monit.sh /dev/null 21监控磁盘的监控脚本
[rootceph-node1 ~]# cat disk_monit.sh
#!/bin/bash
#filename:Monitor_Disk
Monitor_Disk(){
mkdir -p /mnt/Monitor_Disk
fdisk -l|grep Disk /dev/ | awk {print $2,$3$4}|tr -d ,:/mnt/Monitor_Disk/device_list.log
N1;ECHO 90
while read device_line
do
Deviceecho $device_line|awk {print $1}
Sumecho $device_line|awk {print $2}
df -h |grep $Device|sort/mnt/Monitor_Disk/${N}_partitions.log
echo
echo ** 第$N块硬盘($Device):${Sum} **| grep -E $Device|$Sum|$N --coloryes
echo ------------------------------------
echo -e linux分区 挂载目录 总大小 已用 剩余 已用百分比 文件系统 ID system \
块大小 预留空间 /mnt/Monitor_Disk/${N}_Over.log
echo -e \/mnt/Monitor_Disk/${N}_Over.log
Num_Partitioncat /mnt/Monitor_Disk/${N}_partitions.log|wc -l
n0
while read partition_line
doPartition_Nameecho $partition_line|awk {print $1}Mount_Direcho $partition_line|awk {print $6}Partition_Sumecho $partition_line|awk {print $2}Partition_Usedecho $partition_line|awk {print $3}Partition_Leaveecho $partition_line| awk {print $4}Partition_Percentecho $partition_line|awk {print $5}Partition_Typemount|grep $Partition_Name|awk {print $5$6}Partition_Idfdisk -l | grep $Partition_Name|tr -d \*|awk {print $5}Partition_Systemfdisk -l | grep $Partition_Name|tr -d \*|awk {print $6}Part_Block_Size_Btune2fs -l $Partition_Name|grep Block size|awk {print $3}Part_Lift_For_Root_Blockstune2fs -l $Partition_Name|grep Reserved block count:|\awk {print $4}Part_Block_Sizeecho $Part_Block_Size_B/1024|bcPart_Lift_For_Rootecho ${Part_Lift_For_Root_Blocks}*${Part_Block_Size}/1024|bcecho -e $Partition_Name $Mount_Dir $Partition_Sum $Partition_Used $Partition_Leave \
$Partition_Percent $Partition_Type $Partition_Id $Partition_System \
${Part_Block_Size}K ${Part_Lift_For_Root}M/mnt/Monitor_Disk/${N}_Over.loglet n[ $n -eq $Num_Partition ](cat /mnt/Monitor_Disk/${N}_Over.log|column -t;echo)
done/mnt/Monitor_Disk/${N}_partitions.log
let N
done/mnt/Monitor_Disk/device_list.log
ECHO 90
rm -fr /mnt/Monitor_Disk
}
ECHO(){
for ((i1;i$1;i))
do
echo -n #
[ $i -eq $1 ](echo;echo)
done
}
Monitor_Disk[rootceph-node1 ~]# chmod 755 disk_monit.sh
[rootceph-node1 ~]# sh disk_monit.sh
##########################################################################################** 第1块硬盘(/dev/sdb):577.4GB **
------------------------------------
linux分区 挂载目录 总大小 已用 剩余 已用百分比 文件系统 ID system 块大小 预留空间/dev/sdb1 /data 530G 42G 461G 9% ext4(rw) 83 Linux 4K 27532M** 第2块硬盘(/dev/sda):322.1GB **
------------------------------------
linux分区 挂载目录 总大小 已用 剩余 已用百分比 文件系统 ID system 块大小 预留空间/dev/sda1 /boot 283M 76M 193M 29% ext4(rw) 83 Linux 1K 15M
/dev/sda3 / 265G 3.1G 248G 2% ext4(rw) 83 Linux 4K 13744M##########################################################################################监控磁盘IO使用率的脚本实时查看IO使用情况防止因为磁盘IO效率低而导致MySQL查询慢的问题
#!/bin/bash
#监控磁盘IO使用率并告警#定义收件人邮箱
mail/usr/local/sbin/mail.py
mail_useradminadmin.comif ! which iostat /dev/null
thenyum install -y sysstat
fiif ! which iotop /dev/null
thenyum install -y iotop
filogdir/data/iologdtdate %F #以日期作为日志名字#获取IO取5次平均值
get_io()
{iostat -dx 1 5 $logdir/iostat.logsum0for ut in grep ^$1 $logdir/iostat.log |awk {print $NF} |cut -d . -f 1dosum$[$sum$ut]doneecho $[$sum/5]
}while ture
dofor d in iostat -dx |egrep -v ^$|Device:|CPU\} |awk {print $1}doioget_io $dif [ $io -gt 90 ]thendate $logdir/$dtcat $logdir/iostat.log $logdir/$dtiotop -obn2 $logdir/$dtecho ################### $logdir/$dtpython $mail $mail_user 磁盘IO使用率超过90% cat $logdir/$dt 2/dev/nullfidonesleep 10
done实时监控网卡流量的通用脚本
[rootceph-node1 ~]# cat /root/net_monit.sh
#!/bin/bash
PATH/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin;
export PATH
function traffic_monitor {OS_NAME$(sed -n 1p /etc/issue)eth$1if [ ! -d /sys/class/net/$eth ];thenecho -e Network-Interface Not Foundecho -e You system have network-interface:\nls /sys/class/netexit 5fiwhile [ 1 ]doSTATUSfineRXpre$(cat /proc/net/dev | grep $eth | tr : | awk {print $2})TXpre$(cat /proc/net/dev | grep $eth | tr : | awk {print $10})sleep 1RXnext$(cat /proc/net/dev | grep $eth | tr : | awk {print $2})TXnext$(cat /proc/net/dev | grep $eth | tr : | awk {print $10})clearRX$((${RXnext}-${RXpre}))TX$((${TXnext}-${TXpre}))if [[ $RX -lt 1024 ]];thenRX${RX}B/selif [[ $RX -gt 1048576 ]];thenRX$(echo $RX | awk {print $1/1048576 MB/s})$STATUSbusyelseRX$(echo $RX | awk {print $1/1024 KB/s})fiif [[ $TX -lt 1024 ]];thenTX${TX}B/selif [[ $TX -gt 1048576 ]];thenTX$(echo $TX | awk {print $1/1048576 MB/s})elseTX$(echo $TX | awk {print $1/1024 KB/s})fiecho -e echo -e Welcome to Traffic_Monitor stageecho -e version 1.0echo -e Since 2018.7.2echo -e Created by wangshiboecho -e BLOG: http://www.cnblogs.cn/kevingraceecho -e echo -e System: $OS_NAMEecho -e Date: date %Fecho -e Time: date %k:%M:%Secho -e Port: $1echo -e Status: $STATUSecho -e \t RX \tTXecho ------------------------------echo -e $eth \t $RX $TX echo ------------------------------echo -e Press CtrlC to exitdone
}if [[ -n $1 ]];thentraffic_monitor $1
elseecho -e None parameter,please add system netport after run the script! \nExample: sh traffic_monitor eth0
fi[rootceph-node1 ~]# chmod 755 /root/net_monit.sh
[rootceph-node1 ~]# sh /root/net_monit.sh eth0 #eth0是网卡设备名称如果是网卡绑定bond0后面就跟bond0Welcome to Traffic_Monitor stage
version 1.0
Since 2018.7.2
Created by wangshibo
BLOG: http://www.cnblogs.cn/kevingraceSystem: CentOS release 6.9 (Final)
Date: 2018-07-02
Time: 15:19:34
Port: eth0
Status: fineRX TX
------------------------------
eth0 417B/s 390B/s
------------------------------
Press CtrlC to exitWelcome to Traffic_Monitor stage
version 1.0
Since 2018.7.2
Created by wangshibo
BLOG: http://www.cnblogs.cn/kevingraceSystem: CentOS release 6.9 (Final)
Date: 2018-07-02
Time: 15:19:35
Port: eth0
Status: fineRX TX
------------------------------
eth0 1.49902KB/s 1.3252KB/s
------------------------------
Press CtrlC to exit
检测网卡流量并按规定格式记录在日志中
#!/bin/bash
#######################################################
#检测网卡流量并按规定格式记录在日志中#规定一分钟记录一次
#日志格式如下所示:
#2019-08-12 20:40
#ens33 input: 1234bps
#ens33 output: 1235bps
######################################################3
while :
do
#设置语言为英文保障输出结果是英文否则会出现bug
LANGen
logfile/tmp/date %d.log
#将下面执行的命令结果输出重定向到logfile日志中
exec $logfile
date %F %H:%M
#sar命令统计的流量单位为kb/s日志格式为bps因此要*1000*8
sar -n DEV 1 59|grep Average|grep ens33|awk {print $2,\t,input:,\t,$5*1000*8,bps,\n,$2,\t,output:,\t,$6*1000*8,bps}
echo ####################
#因为执行sar命令需要59秒因此不需要sleep
done指定时间内网站访问次数的监控
需求说明 在日常运维工作中为了防止一些恶意访问的行为例如不断的请求刷流量通过实时过滤Nginx访问日志将单位时间内访问次数达到指定阀值的来源ip查找出来并通过邮件报警方式及时通知运维人员
比如针对url为http://192.168.10.202:8888的访问进行监控当在1分钟内访问次数超过300次数就邮件报警给运维人员。
nginx日志监控脚本
[rootFastdfs_storage_s1 ~]# cat /opt/nginx_log_monit.sh
#!/bin/bash
#日志文件
logfile/usr/local/nginx/logs/access.log#开始时间
start_timedate -d$last_minutes minutes ago %H:%M:%S#结束时间
stop_timedate %H:%M:%S#过滤出单位之间内的日志并统计最高ip数
tac $logfile | awk -v st$start_time -v et$stop_time {tsubstr($4,RSTART14,21);if(tst tet) {print $0}} \
| awk {print $1} | sort | uniq -c | sort -nr /root/log_ip_top10
ip_topcat /root/log_ip_top10 | head -1 | awk {print $1}
# 单位时间[1分钟]内单ip访问次数超过300次则触发邮件报警
if [[ $ip_top -gt 300 ]];then/usr/bin/python /opt/send_mail.py
fipython报警脚本
[rootFastdfs_storage_s1 ~]# cat /opt/send_mail.py
# -*- coding: utf-8 -*-
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from datetime import datetime
import os
import smtplib
def _format_addr(s):name, addr parseaddr(s)return formataddr((Header(name, utf-8).encode(), addr))
# 邮箱定义
smtp_server smtp.kevin.com
smtp_port 465
from_addr monitkevin.com
password os.environ.get(monit123)
to_addr [wangshibokevin.com]
# 邮件对象
msg MIMEMultipart()
msg[From] _format_addr(发件人 %s % from_addr)
msg[To] _format_addr(收件人 %s % to_addr)
msg[Subject] Header(Warning:单ip请求次数异常, utf-8).encode()
# 获取系统中要发送的文本内容
with open(/root/log_ip_top10, r) as f:line f.readline().strip()line line.split( )
print(line)
# 邮件正文是MIMEText:
html htmlbodyh2一分钟内单ip请求次数超过阀值/h2 \pip:%s 请求次数/min:%s/p % (line[1],line[0]) \/body/html
msg.attach(MIMEText(html, html, utf-8))
server smtplib.SMTP_SSL(smtp_server, smtp_port)
server.login(from_addr, password)
server.sendmail(from_addr, to_addr, msg.as_string())
server.quit()
写个测试脚本不停curl请求资源触发报警
[rootFastdfs_storage_s1 ~]# cat /opt/curl.sh
#!/bin/bash
#examplecurl.sh http://www.kevin.com 100
usage()
{echo usage: basename $0 url count
}
if [ $# -ne 2 ]; thenusageexit 1
fi
for i in seq 1 $2;dohttp_codecurl -o /dev/null -s -w %{http_code} $1echo $1 $http_code
done手动执行测试脚本
[rootFastdfs_storage_s1 ~]# /bin/bash /opt/curl.sh http://192.168.10.202:8888 300
http://192.168.10.202:8888 200
http://192.168.10.202:8888 200
http://192.168.10.202:8888 200
http://192.168.10.202:8888 200
http://192.168.10.202:8888 200
http://192.168.10.202:8888 200
http://192.168.10.202:8888 200
http://192.168.10.202:8888 200
http://192.168.10.202:8888 200
http://192.168.10.202:8888 200
http://192.168.10.202:8888 200
...........
定时任务由于上面脚本是监控一分钟内的日志因此每分钟执行一次
[rootFastdfs_storage_s1 ~]# crontab -e
* * * * * /bin/bash -x /opt/nginx_log_monit.sh /dev/null 21这里仅仅是实现了邮件告警功能实际上还可以实现自动屏蔽恶意访问的ip。 可以通过Nginx deny来实现也可以通过iptables屏蔽iptables -I INPUT -s x.x.x.x -j DROP方式
网站访问状态和超时时间监控报警设置
对网站访问状态和超时时间进行监控当code状态为5xx或者访问超时时间大于10s时进行报警。脚本脚本如下
[rootqd-inf-logcollector01 web_monit]$ pwd
/app/script/web_monit[rootqd-inf-logcollector01 web_monit]$ ll
total 12
-rwxr-xr-x 1 root root 870 Oct 12 21:34 http_monit.sh //监控脚本
-rwxr-xr-x 1 root root 857 Oct 12 21:25 sms.py //短信报警脚本里面有报警联系人
-rw-r--r-- 1 root root 377 Oct 12 21:27 weblist.txt //监控的网站域名列表[rootqd-inf-logcollector01 web_monit]$ cat http_monit.sh
#!/bin/sh
weblist/app/script/web_monit/weblist.txt
for list in cat $weblist|grep -E -v #|^$
do
httpcodecurl -o /dev/null -s -w %{http_code} $list
httptimecurl -o /dev/null -s -w time_connect: %{time_connect}\ntime_starttransfer: %{time_starttransfer}\ntime_total: %{time_total}\n $list|grep time_total|awk -F : {print $2*1000}
if [ $httpcode 500 ]||[ $httpcode 502 ]||[ $httpcode 503 ]||[ $httpcode 504 ]
thenpython /app/script/web_monit/sms.py $list $list 访问有误!状态码为$httpcode!请收到报警后尽快查看并处理!
elseecho $list is checked ok!
fiif [ $httptime -ge 10000 ]
thenpython /app/script/web_monit/sms.py $list $list访问超时!超时时间为$httptime毫秒!请收到报警后尽快查看并处理!
elseecho $list is connect ok!
fi
done手动检查网站访问的code状态码
[rootqd-inf-logcollector01 web_monit]$ curl -o /dev/null -s -w %{http_code} http://www.wang.com
200手动检查网站访问的超时时间单位毫秒如下网址访问的时间为0.8秒
[rootqd-inf-logcollector01 web_monit]$ curl -o /dev/null -s -w time_connect: %{time_connect}\ntime_starttransfer: %{time_starttransfer}\ntime_total: %{time_total}\n http://www.wang.com |grep time_total|awk -F : {print $2*1000}
800网站列表和脚本执行
[rootqd-inf-logcollector01 web_monit]$cat weblist.txt
http://nop.kevin.cn
http://ap.kevin.cn
http://ope.kevin.cn
http://opr.kevin.cn
http://www.kevin.cn
http://kevin.cn
http://tb.kevin.cn
http://www.wang.com
https://www.wang.comhttp://doc.kevin.cn
http://docs.kevin.cn
http://git.wang.com
http://monitor.kevin.cn
http://dash.kevin.cn[rootqd-inf-logcollector01 web_monit]$sh http_monit.sh
http://nop.kevin.cn is checked ok!
http://nop.kevin.cn is connect ok!
http://ap.kevin.cn is checked ok!
http://ap.kevin.cn is connect ok!
http://ope.kevin.cn is checked ok!
http://ope.kevin.cn is connect ok!
http://opr.kevin.cn is checked ok!
http://opr.kevin.cn is connect ok!
http://www.kevin.cn is checked ok!
http://www.kevin.cn is connect ok!
http://kevin.cn is checked ok!
http://kevin.cn is connect ok!
http://tb.kevin.cn is checked ok!
http://tb.kevin.cn is connect ok!
http://www.wang.com is checked ok!
http://www.wang.com is connect ok!
https://www.wang.com is checked ok!
https://www.wang.com is connect ok!
http://doc.kevin.cn is checked ok!
http://doc.kevin.cn is connect ok!
http://docs.kevin.cn is checked ok!
http://docs.kevin.cn is connect ok!
http://git.wang.com is checked ok!
http://git.wang.com is connect ok!
http://monitor.kevin.cn is checked ok!
http://monitor.kevin.cn is connect ok!
http://dash.kevin.cn is checked ok!
http://dash.kevin.cn is connect ok!定时监控任务(每两分钟监控一次)
[rootqd-inf-logcollector01 web_monit]$ crontab -l
*/2 * * * * /bin/bash -x /app/script/web_monit/http_monit.sh /dev/null 21简单注意下比较运算符只有和!是用于字符串比较的不可用于整数比较整数比较只能使用-eq, -gt这种形式
服务器磁盘监控脚本含报警邮件
在日常的运维工作中我们经常会对服务器的磁盘使用情况进行巡检以防止磁盘爆满导致的业务故障。如果能编写一个合理完善的监控脚本当磁盘使用率达到我们设置的阀值时就自动发送报警邮件以便我们及时获悉到快爆满的磁盘情况
下面分享一个脚本 监控本机的根磁盘和home盘当根磁盘使用率达到90%和home磁盘使用率达到95%的时候发报警邮件至wangshibokevin.cn和liugangkevin.cn
[rootkevin ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root 50G 46G 12G 90% /
tmpfs 32G 68K 32G 1% /dev/shm
/dev/sda1 485M 40M 421M 9% /boot
/dev/mapper/VolGroup-lv_home 836G 795G 673G 95% /home取根磁盘当前利用率的百分值
[rootkevin ~]# /bin/df -h|grep /dev/mapper/VolGroup-lv_root|awk -F {print $5}|cut -d% -f1
90取home盘当前利用率的百分值
[rootkevin ~]# /bin/df -h|grep /dev/mapper/VolGroup-lv_home|awk -F {print $5}|cut -d% -f1
95编写邮件报警脚本
[rootkevin ~]# vim /root/root_disk.sh
#!/bin/bash
SERVER_IPifconfig|grep 192.168.1|awk -F: {print $2}|cut -d -f1
ROOT_DISK/bin/df -h|grep /dev/mapper/VolGroup-lv_root|awk -F {print $5}|cut -d% -f1
HOME_DISK/bin/df -h|grep /dev/mapper/VolGroup-lv_home|awk -F {print $5}|cut -d% -f1if [ $ROOT_DISK -ge 90 ];then
/usr/local/bin/sendEmail -f opskevin.cn -t wangshibokevin.cn -s smtp.kevin.cn -u The ROOT_DISK of $SERVER_IP-$HOSTNAME is warning! -o message-content-typehtml -o message-charsetutf8 -xu opskevin.cn -xp zh123bj -m The ROOT_DISK of $SERVER_IP-$HOSTNAMEnow use% is 90%please deal with it as soon as possible
/usr/local/bin/sendEmail -f opskevin.cn -t liugangkevin.cn -s smtp.kevin.cn -u The ROOT_DISK of $SERVER_IP-$HOSTNAME is warning! -o message-content-typehtml -o message-charsetutf8 -xu opskevin.cn -xp zh123bj -m The ROOT_DISK of $SERVER_IP-$HOSTNAMEnow use% is 90%please deal with it as soon as possible
else
echo The ROOT_DISK of $SERVER_IP-$HOSTNAME is Enough to use
fisleep 5if [ $HOME_DISK -ge 95 ];then
/usr/local/bin/sendEmail -f opskevin.cn -t wangshibokevin.cn -s smtp.kevin.cn -u The HOME_DISK of $SERVER_IP-$HOSTNAME is warning! -o message-content-typehtml -o message-charsetutf8 -xu opskevin.cn -xp zh123bj -m The HOME_DISK of $SERVER_IP-$HOSTNAMEnow use% is 95%please deal with it as soon as possible
/usr/local/bin/sendEmail -f opskevin.cn -t liugangkevin.cn -s smtp.kevin.cn -u The HOME_DISK of $SERVER_IP-$HOSTNAME is warning! -o message-content-typehtml -o message-charsetutf8 -xu opskevin.cn -xp zh123bj -m The HOME_DISK of $SERVER_IP-$HOSTNAMEnow use% is 95%please deal with it as soon as possible
else
echo The ROOT_DISK of $SERVER_IP-$HOSTNAME is Enough to use
fi
设置计划任务
[rootkevin ~]# crontab -e
*/30 * * * * /bin/bash -x /root/root_disk.sh /dev/null 21上面脚本中的邮件报警用的是sendemail需要提前安装sendemail环境安装操作如下
1先下载安装包到本地解压。
[rootkevin ~]# cd /usr/local/src/
[rootkevin src]# wget -c http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz
[rootkevin src]# tar -zvxf sendEmail-v1.56.tar.gz
[rootkevin src]# cd sendEmail-v1.56
[rootkevin sendEmail-v1.56]# cp -a sendEmail /usr/local/bin/
[rootkevin sendEmail-v1.56]# chmod x /usr/local/bin/sendEmail
[rootkevin sendEmail-v1.56]# file /usr/local/bin/sendEmail
/usr/local/bin/sendEmail: a /usr/bin/perl -w script text executable2安装下依赖
[rootkevin sendEmail-v1.56]# yum install perl-Net-SSLeay perl-IO-Socket-SSL -y[rootkevin sendEmail-v1.56]# /usr/local/bin/sendEmail -f fromkevin.cn -t tokevin.cn -s smtp.kevin.cn -u 我是邮件主题 -o message-content-typehtml -o message-charsetutf8 -xu fromkevin.cn -xp zh123bj -m 我是邮件内容命令说明
/usr/local/bin/sendEmail #命令主程序
-f fromkevin.cn #发件人邮箱
-t tokevin.cn #收件人邮箱
-s smtp.huanqi.cn #发件人邮箱的smtp服务器
-u 我是邮件主题 #邮件的标题
-o message-content-typehtml #邮件内容的格式,html表示它是html格式
-o message-charsetutf8 #邮件内容编码
-xu fromkevin.cn #发件人邮箱的用户名
-xp zh123bj #发件人邮箱密码
-m 我是邮件内容 #邮件的具体内容例如:
[rootkevin alertscripts]# /usr/local/bin/sendEmail -f opskevin.cn -t wangshibokevin.cn -s smtp.kevin.cn -u 我是邮件主题 -o message-content-typehtml -o message-charsetutf8 -xu opskevin.cn -xp zh123bj -m 我是邮件内容
Oct 14 19:38:29 kevin sendEmail[65454]: Email was sent successfully!登陆wangshibokevin.cn邮箱发现已经收到了上面发送的邮件 业务日志清理脚本
线上某些系统业务跑一段时间后日志就会越来越多考虑到业务机器磁盘有限需要添加业务日志清理功能。根据日志所在分区磁盘使用情况来判断是否清理日志比如当日志分区磁盘空间使用超过90%时将一周前的日志打包转移到别处 (别的分区下或远程存储设备上)。脚本 (/opt/script/log_clear.sh) 如下:
#!/bin/bash#定义日志所在分区当前空间所占比例数(去掉%)。grep -w表示精准匹配只匹配/这个分区
LOG_PARTITION$(which df -h|awk {print $5,$6}|grep -w /|cut -d -f1|awk -F% {print $1})
#定义一周前的日期用于日志分区空间超过设定的阈值后保留的份数(这里保留一周的日志)
KEEP_DATEdate -d -7 days %Y%m%d
#定义日志路径
LOG_DIR/opt/log/kevin
#定义日志备份路径(即当日志分区空间超过阈值后将日志转移到该处。这里就转移到了本地home分区下也可以转移到别的机器或远程存储设备上)
LOG_BACK_DIR/home/log/kevin#确保日志备份路径存在如果不存在则创建该路径。
if [ ! -d ${LOG_BACK_DIR} ];thenwhich mkdir -p ${LOG_BACK_DIR}
elseecho ${LOG_BACK_DIR} is exist /dev/null 21
fi#当日志分区当前空间超过90%时执行的动作
if [ ${LOG_PARTITION} -ge 90 ];then#切换到日志路径下cd ${LOG_DIR}#截取日志文件中的日期比如stepweb_20190915.log日志文件则截取20190915for LOG_DATE in $(ls -l ${LOG_DIR}|awk {print $9}|cut -d_ -f2|awk -F. {print $1})do#当日志文件中截取的日期是一周之前的日志时执行的动作if [ ${LOG_DATE} -lt ${KEEP_DATE} ];then#打包转移删除#注意这里tar使用-P参数因为tar默认为相对路径使用绝对路径的话会报错Removing leading /’ from member names,使用-P参数就解决了该问题which tar -zvPcf ${LOG_DIR}/stepweb_${LOG_DATE}.log.tar.gz ${LOG_DIR}/stepweb_${LOG_DATE}.logmv ${LOG_DIR}/stepweb_${LOG_DATE}.log.tar.gz ${LOG_BACK_DIR}/rm -rf ${LOG_DIR}/stepweb_${LOG_DATE}.logelseecho keep stepweb_${LOG_DATE}.log /dev/null 21fidone
elseecho ${LOG_PARTITION} is available /dev/null 21
fi根据上面脚本验证下
查看本机磁盘使用情况日志所在分区磁盘当前使用率达到92%了
[rootyyweb kevin]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 50G 46G 4G 92% /
devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 34M 3.8G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda1 1014M 183M 832M 19% /boot
/dev/mapper/centos-home 142G 33M 142G 1% /home日志所在路径
[rootyyweb kevin]# pwd
/opt/log/kevin日志情况
[rootyyweb kevin]# ls
stepweb_20190810.log stepweb_20190817.log stepweb_20190824.log stepweb_20190901.log stepweb_20190908.log stepweb_20190915.log
stepweb_20190811.log stepweb_20190818.log stepweb_20190825.log stepweb_20190902.log stepweb_20190909.log stepweb_20190916.log
stepweb_20190812.log stepweb_20190819.log stepweb_20190826.log stepweb_20190903.log stepweb_20190910.log stepweb_20190917.log
stepweb_20190813.log stepweb_20190820.log stepweb_20190827.log stepweb_20190904.log stepweb_20190911.log stepweb_20190918.log
stepweb_20190814.log stepweb_20190821.log stepweb_20190828.log stepweb_20190905.log stepweb_20190912.log stepweb_20190919.log
stepweb_20190815.log stepweb_20190822.log stepweb_20190829.log stepweb_20190906.log stepweb_20190913.log
stepweb_20190816.log stepweb_20190823.log stepweb_20190830.log stepweb_20190907.log stepweb_20190914.log[rootyyweb kevin]# ls /home/
[rootyyweb kevin]#执行日志清理脚本
[rootyyweb kevin]# sh /opt/script/log_clear.sh
/opt/log/kevin/stepweb_20190810.log
/opt/log/kevin/stepweb_20190811.log
/opt/log/kevin/stepweb_20190812.log
/opt/log/kevin/stepweb_20190813.log
/opt/log/kevin/stepweb_20190814.log
/opt/log/kevin/stepweb_20190815.log
/opt/log/kevin/stepweb_20190816.log
/opt/log/kevin/stepweb_20190817.log
/opt/log/kevin/stepweb_20190818.log
/opt/log/kevin/stepweb_20190819.log
/opt/log/kevin/stepweb_20190820.log
/opt/log/kevin/stepweb_20190821.log
/opt/log/kevin/stepweb_20190822.log
/opt/log/kevin/stepweb_20190823.log
/opt/log/kevin/stepweb_20190824.log
/opt/log/kevin/stepweb_20190825.log
/opt/log/kevin/stepweb_20190826.log
/opt/log/kevin/stepweb_20190827.log
/opt/log/kevin/stepweb_20190828.log
/opt/log/kevin/stepweb_20190829.log
/opt/log/kevin/stepweb_20190830.log
/opt/log/kevin/stepweb_20190901.log
/opt/log/kevin/stepweb_20190902.log
/opt/log/kevin/stepweb_20190903.log
/opt/log/kevin/stepweb_20190904.log
/opt/log/kevin/stepweb_20190905.log
/opt/log/kevin/stepweb_20190906.log
/opt/log/kevin/stepweb_20190907.log
/opt/log/kevin/stepweb_20190908.log
/opt/log/kevin/stepweb_20190909.log
/opt/log/kevin/stepweb_20190910.log
/opt/log/kevin/stepweb_20190911.log
/opt/log/kevin/stepweb_20190912.log日志清理后日志路径下只保留了最近一周的日志
[rootyyweb kevin]# ls
stepweb_20190913.log stepweb_20190915.log stepweb_20190917.log stepweb_20190919.log
stepweb_20190914.log stepweb_20190916.log stepweb_20190918.log一周之前的日志被打包转移到/home/log/kevin下了
[rootyyweb kevin]# ls /home/log/kevin/
stepweb_20190810.log.tar.gz stepweb_20190817.log.tar.gz stepweb_20190824.log.tar.gz stepweb_20190901.log.tar.gz stepweb_20190908.log.tar.gz
stepweb_20190811.log.tar.gz stepweb_20190818.log.tar.gz stepweb_20190825.log.tar.gz stepweb_20190902.log.tar.gz stepweb_20190909.log.tar.gz
stepweb_20190812.log.tar.gz stepweb_20190819.log.tar.gz stepweb_20190826.log.tar.gz stepweb_20190903.log.tar.gz stepweb_20190910.log.tar.gz
stepweb_20190813.log.tar.gz stepweb_20190820.log.tar.gz stepweb_20190827.log.tar.gz stepweb_20190904.log.tar.gz stepweb_20190911.log.tar.gz
stepweb_20190814.log.tar.gz stepweb_20190821.log.tar.gz stepweb_20190828.log.tar.gz stepweb_20190905.log.tar.gz stepweb_20190912.log.tar.gz
stepweb_20190815.log.tar.gz stepweb_20190822.log.tar.gz stepweb_20190829.log.tar.gz stepweb_20190906.log.tar.gz
stepweb_20190816.log.tar.gz stepweb_20190823.log.tar.gz stepweb_20190830.log.tar.gz stepweb_20190907.log.tar.gz再贴一个简单的日志处理脚本
#!/usr/bin/sh
#根据系统/服务/日志保留天数三个参数压缩日志
#usage: sh clearlog.sh sysname appname keepdays
sysName$1
appName$2
keepDay$3
logDir/var/log/${sysName}/${appName}
logFile${appName}.log
cd ${logDir}
find ./ -name ${logFile}.*[0-9][0-9] -mtime ${keepDay} -exec gzip {} \;Linux下间隔多少秒 (即以秒为单位) 去执行某条命令或某个shell脚本的操作方法
在日常运维工作中 经常会碰到以秒为单位去定时执行某些命令或监控脚本的需求。 说到定时任务就要用到crontab通常来说crontab的最小单位是分钟级别要想实现秒级别的定时任务就要进行特殊设置了。
[roottest ~]# cat /root/kevin.sh
#!/bin/bash
echo beijing is so good! /root/test.log添加脚本执行权限并配置到crontab计划任务里使用 或者 都是一样的效果。思路先过一分钟执行第一次接着就是每隔2秒钟执行一次。
[roottest ~]# chmod 755 /root/kevin.sh
[roottest ~]# crontab -e
* * * * * /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 2 /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 4; /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 6; /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 8; /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 10; /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 12; /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 14; /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 16; /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 18; /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 20; /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 22; /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 24; /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 26; /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 28; /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 30; /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 32; /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 34; /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 36; /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 38; /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 40; /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 42; /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 44; /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 46; /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 48; /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 50; /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 52; /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 54; /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 56; /bin/bash -x /root/kevin.sh /dev/null 21
* * * * * sleep 58; /bin/bash -x /root/kevin.sh /dev/null 21[roottest ~]# tail -f /root/test.log
beijing is so good!
beijing is so good!
beijing is so good!
beijing is so good!
beijing is so good!
beijing is so good!
beijing is so good!
beijing is so good!
beijing is so good!
..........
..........Linux下批量ping某个网段ip的脚本
比如现在需要对172.16.50.0/24网段的ip进行检查检查哪些ip现在被占用哪些ip没有被占用可以通过ping命令来检查脚本如下:
[rootuatdns01 opt]# vim /opt/ping.sh
#!/bin/bash
. /etc/init.d/functions
for var in {1..254};
do
ip172.16.50.$var
ping -c2 $ip /dev/null 21
if [ $? 0 ];then
action $ip /bin/true
else
action $ip /bin/false
fi
done[rootuatdns01 opt]# chmod 755 /opt/ping.sh
[rootuatdns01 opt]# sh /opt/ping.sh
172.16.50.1 [ OK ]
172.16.50.2 [FAILED]
172.16.50.3 [FAILED]
172.16.50.4 [FAILED]
172.16.50.5 [FAILED]
.........
.........
172.16.50.99 [ OK ]
172.16.50.100 [ OK ]
172.16.50.101 [ OK ]
172.16.50.102 [ OK ]
172.16.50.103 [ OK ]
172.16.50.104 [ OK ]
172.16.50.105 [ OK ]
172.16.50.106 [ OK ]
172.16.50.107 [ OK ]
172.16.50.108 [ OK ]
172.16.50.109 [ OK ]
172.16.50.110 [ OK ]
172.16.50.111 [FAILED]
172.16.50.112 [ OK ]获取172.16.60.0/24网段可用ip的shell脚本
[rootansible-server ~]# cat ip_ping.sh
#!/bin/bash
ip1
while [ $ip ! 254 ]; do
ping 172.16.60.$ip -c 2 | grep -q ttl echo 172.16.60.$ip yes || echo 172.16.60.$ip no
ipexpr $ip 1
done执行:
[rootansible-server ~]# sh ip_ping.sh
172.16.60.1 yes
172.16.60.2 no
172.16.60.3 no
.............
172.16.60.24 yes
172.16.60.25 yes
172.16.60.26 no
.............如果只打印可用ip, 则脚本修改如下:
[rootansible-server ~]# cat ip_ping.sh
#!/bin/bash
ip1
while [ $ip ! 254 ]; do
ping 172.16.60.$ip -c 2 | grep -q ttl echo 172.16.60.$ip yes || echo 172.16.60.$ip no /dev/null 21
ipexpr $ip 1
done执行:
[rootansible-server ~]# sh ip_ping.sh
172.16.60.1 yes
172.16.60.21 yes
172.16.60.22 yes
172.16.60.23 yes
172.16.60.24 yes
172.16.60.25 yes
172.16.60.31 yes
172.16.60.32 yes
172.16.60.33 yes
172.16.60.34 yes
172.16.60.35 yes
172.16.60.36 yes
172.16.60.37 yes
172.16.60.38 yes
172.16.60.39 yes获取172.16.50.0/24, 172.16.51.0/24, 172.16.60.0/24 三个网段的可用ip
[rootansible-server ~]# cat ip_ping.sh
#!/bin/bash
ip1
while [ $ip ! 254 ]; doping 172.16.50.$ip -c 2 | grep -q ttl echo 172.16.50.$ip yes || echo 172.16.50.$ip no /dev/null 21
ipexpr $ip 1ping 172.16.51.$ip -c 2 | grep -q ttl echo 172.16.51.$ip yes || echo 172.16.51.$ip no /dev/null 21
ipexpr $ip 1ping 172.16.60.$ip -c 2 | grep -q ttl echo 172.16.60.$ip yes || echo 172.16.60.$ip no /dev/null 21
ipexpr $ip 1done执行:
[rootansible-server ~]# sh ip_ping.sh
172.16.50.1 yes
172.16.51.11 yes
172.16.50.16 yes
172.16.50.19 yes
172.16.51.20 yes
172.16.60.21 yes
172.16.50.22 yes
172.16.60.24 yes
172.16.50.25 yes
172.16.50.31 yes
172.16.60.33 yes
172.16.51.35 yes
172.16.60.36 yes
172.16.60.39 yes
172.16.51.41 yes
172.16.51.44 yes
172.16.50.52 yes
172.16.51.53 yes
172.16.50.55 yes
172.16.50.58 yes
172.16.51.65 yes
..................查看系统运行情况
#!/bin/bash
#用于查看系统运行情况#功能选择菜单
menu(){echo -e \033[31;32m 查看系统运行情况 \033[0mecho -e \033[31;32m\033[0mecho -e \033[34m请选择:\033[0mecho -e \033[33m1、查看系统负载 2、查看CPU消耗% 3、查看内存消耗% 4、查看SWAP消耗% \033[0mecho -e \033[33m5、查看磁盘消耗% 6、查看inode消耗% 7、查看磁盘IO 8、查看网络流量 \033[0mecho -e \033[33m9、一键查看所有情况 10、退出脚本 \033[0mecho -e \033[31;32m\033[0mechoread -p 请输入数字1-8[单独查看]9[一键查看]10[退出脚本]: num
}#(1)查看系统负载
load_average(){cpu_coregrep model name /proc/cpuinfo | wc -lecho -e \033[36mCPU核数: $cpu_core\033[0mloaduptime |awk -F , {print $3 $4 $5} |sed s/^ *//echo -e \033[36m$load\033[0mecho
}#(2)查看CPU消耗%
cpu_use_percent(){cpu_idlevmstat |awk {print $15} |sed 1,2dcpu_use$[100-$cpu_idle]echo -e \033[36mCPU使用率%: $cpu_use\033[0mecho
}#(3)查看内存消耗%
mem_use_percent(){mem_usedfree -m |grep Mem |awk {print $3}mem_tolfree -m |grep Mem |awk {print $2}mem_useawk BEGIN{print $mem_used/$mem_tol*100}echo -e \033[36m内存已使用$mem_usedM,总内存$mem_tolM,内存使用率%: $mem_use\033[0mecho
}#(4)查看SWAP消耗%
swap_use_percent(){swap_usedfree -m |grep Swap |awk {print $3}swap_tolfree -m |grep Swap |awk {print $2}swap_useawk BEGIN{print $swap_used/$swap_tol*100}echo -e \033[36mSwap已使用$swap_usedM,总Swap$swap_tolM,Swap使用率%: $swap_use\033[0mecho
}#(5)查看磁盘消耗%
disk_use_percent(){disk_usedf -h |sed 1decho -e \033[36m磁盘使用情况: \n$disk_use\033[0mecho
}#(6)查看inode消耗%
inode_use_percent(){inode_usedf -i |sed 1decho -e \033[36minode使用情况: \n$inode_use\033[0mecho
}#(7)查看磁盘IO
disk_io(){disk_io_bivmstat |awk {print $9} |sed 1,2decho -e \033[36m发送到块设备的块数: $disk_io_bi块每秒\033[0mdisk_io_bovmstat |awk {print $10} |sed 1,2decho -e \033[36m从块设备接收到的块数: $disk_io_bo块每秒\033[0mecho
}#(8)查看网络流量
network_flow(){#安装所需命令sysstatif ! rpm -q sysstat /dev/nullthenyum install -y sysstat /dev/nullif [ $? -ne 0 ]thenecho -e \033[31msysstat 安装失败\033[0mexit 1fifiexplainsar -n DEV |sed -n 3pecho -e \033[35m网络流量使用情况: \n$explain\033[0mnetwork_ifsifconfig |grep UP,BROADCAST,RUNNING,MULTICAST |awk -F : {print $1}network_flowsar -n DEV |grep -v Average |grep $network_ifs |tailecho -e \033[36m$network_flow\033[0m
}#脚本运行入口
run(){while true;domenucase $num in1)#1、查看系统负载load_average;;2)#2、查看CPU消耗%cpu_use_percent;;3)#3、查看内存消耗%mem_use_percent;;4) #4、查看SWAP消耗%swap_use_percent;;5) #5、查看磁盘消耗%disk_use_percent;;6) #6、查看inode消耗%inode_use_percent;;7) #7、查看磁盘IOdisk_io;;8) #8、查看网络流量network_flow;;9) #9、一键查看所有情况load_averagecpu_use_percentmem_use_percentswap_use_percentdisk_use_percentinode_use_percentdisk_ionetwork_flowexit 0;;10) #10、退出脚本exit 0;;*);;esacdone
}#调用脚本运行入口
run管理docker
具体要求如下
1脚本支持启动全部容器、关闭全部容器、删除全部容器
2需要提示用户如何使用该脚本需给出范例。
#!/bin/bash
#用于管理docker容器while ture
doread -p 请输入你要执行的操作(stop/start/rm) optif [ -z $opt ]thenecho 请输入你的操作continueelsebreakfi
donedocker ps -a |awk {print $1} /tmp/id.txtcase $opt instop)for id in cat /tmp/id.txtdodocker stop $iddone;;start)for id in cat /tmp/id.txtdodocker start $iddone;;rm)for id in cat /tmp/id.txtdoread -p 将要删除容器$id是否继续(y|n) ccase $c iny|Y)docker rm -f $id;;n|N)echo 容器$id不会被删除;;*)echo 你只能输入 y/Y或者n/N;;esacdone*)echo 你只能输入 start/stop/rm;;esac
Shell多线程备份数据库
本案例就是实现shell多线程备份数据库具体要求如下
1公司的业务量比较大有100个数据库需要全量备份而每个数据库的数据量高达几十GB 注意每一个库都为一个独立的实例即有着独立的ip:port
2预估每一个库的备份时间为30分钟左右,要求在5个小时内完成
3假设100个库的库名、host、port以及配置文件路径都存到一个文件里文件名字为 /tmp/databases.list
4格式为db1 10.10.10.2 3308 /data/mysql/db1/my.cnf 。
#!/bin/bash
#多线程备份数据库
#备份数据库使用xtrabackup由于涉及到myisam命令为innobackupexexec /tmp/mysql_bak.logif ! which inoobackupex /dev/null
thenecho 安装xtrabackup工具yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpmyum install percona-xtrabackup-24if [ $? -ne 0 ]thenecho -e \033[31m安装xtrabackup工具出错请检查\033[0mexit 1fi
fibakdir/data/backup/mysql
bakuservyNctM
bakpass99omeaBHhbak_data()
{db_name$1db_host$2db_port$3cnf$4[ -d $bakdir/$db_name ] || mkdir -p $bakdir/$db_nameinnobackupex --defaults-file$4 --host$2 --port$3 --user$bakuser --password$bakpass --databases$1 $bakdirif [ $? -ne 0 ]thenecho -e \033[31m备份数据库$1出现问题\033[0mfi
}fifofile/tmp/$$
mkfifo $fifofile
exec 1000$fifofilen10
for ((i0;i$n;i))
doecho 1000 # 0-9创建10个线程
donecat /tmp/databases.list |while read line
doread -u1000{bak_data echo $lineecho 1000}
donewait
exec 1000- #删除fd1000
rm -f $fifofile #删除命名管道
脚本中
1、exec /tmp/mysql_bak.log 将正确输出和错误输出都重定向到 /tmp/mysql_bak.log 2、$$表示本进程PIDmkfifo命令创建命名管道 3、read line line为变量名将接下来的输入赋值给line
监测 Nginx 访问日志 502 情况并做相应动作
假设服务器环境为 lnmp近期访问经常出现 502 现象且 502 错误在重启 php-fpm 服务后消失因此需要编写监控脚本一旦出现 502则自动重启 php-fpm 服务。
#场景
#1.访问日志文件的路径/data/log/access.log
#2.脚本死循环每10秒检测一次10秒的日志条数为300条出现502的比例不低于10%30条则需要重启php-fpm服务
#3.重启命令为/etc/init.d/php-fpm restart
#!/bin/bash
###########################################################
#监测Nginx访问日志502情况并做相应动作
###########################################################
log/data/log/access.log
N30 #设定阈值
while :do
#查看访问日志的最新300条并统计502的次数
errtail -n 300 $log |grep -c 502
if [ $err -ge $N ]
then
/etc/init.d/php-fpm restart 2 /dev/null
#设定60s延迟防止脚本bug导致无限重启php-fpm服务
sleep 60
fi
sleep 10
done
检测两台服务器指定目录下的文件一致性
#!/bin/bash
######################################
检测两台服务器指定目录下的文件一致性
#####################################
#通过对比两台服务器上文件的md5值达到检测一致性的目的
dir/data/web
b_ip192.168.88.10
#将指定目录下的文件全部遍历出来并作为md5sum命令的参数进而得到所有文件的md5值并写入到指定文件中
find $dir -type f|xargs md5sum /tmp/md5_a.txt
ssh $b_ip find $dir -type f|xargs md5sum /tmp/md5_b.txt
scp $b_ip:/tmp/md5_b.txt /tmp
#将文件名作为遍历对象进行一一比对
for f in awk {print 2} /tmp/md5_a.txtdo
#以a机器为标准当b机器不存在遍历对象中的文件时直接输出不存在的结果
if grep -qw $f /tmp/md5_b.txt
then
md5_agrep -w $f /tmp/md5_a.txt|awk {print 1}
md5_bgrep -w $f /tmp/md5_b.txt|awk {print 1}
#当文件存在时如果md5值不一致则输出文件改变的结果
if [ $md5_a ! $md5_b ]then
echo $f changed.
fi
else
echo $f deleted.
fi
done定时清空文件内容定时记录文件大小
#!/bin/bash
#################################################################
每小时执行一次脚本任务计划当时间为0点或12点时将目标目录下的所有文件内#容清空但不删除文件其他时间则只统计各个文件的大小一个文件一行输出到以时#间和日期命名的文件中需要考虑目标目录下二级、三级等子目录的文件
################################################################
logfile/tmp/date %H-%F.log
ndate %H
if [ $n -eq 00 ] || [ $n -eq 12 ]
then
#通过for循环以find命令作为遍历条件将目标目录下的所有文件进行遍历并做相应操作
for i in find /data/log/ -type f
do
true $i
done
else
for i in find /data/log/ -type f
do
du -sh $i $logfile
done
fi计算文档每行出现的数字个数并计算整个文档的数字总数
#!/bin/bash
#########################################################
#计算文档每行出现的数字个数并计算整个文档的数字总数
########################################################
#使用awk只输出文档行数截取第一段
nwc -l a.txt|awk {print $1}
sum0
#文档中每一行可能存在空格因此不能直接用文档内容进行遍历
for i in seq 1 $ndo
#输出的行用变量表示时需要用双引号
linesed -n $ip a.txt#wc -L选项统计最长行的长度
n_necho $line|sed s/[^0-9]//g|wc -L
echo $n_nsum$[$sum$n_n]
done
echo sum:$sum杀死所有脚本
#!/bin/bash
################################################################
#有一些脚本加入到了cron之中存在脚本尚未运行完毕又有新任务需要执行的情况
#导致系统负载升高因此可通过编写脚本筛选出影响负载的进程一次性全部杀死。
################################################################
ps aux|grep 指定进程名|grep -v grep|awk {print $2}|xargs kill -9从 FTP 服务器下载文件
#!/bin/bash
if [ $# -ne 1 ]; then
echo Usage: $0 filename
fi
dir$(dirname $1)
file$(basename $1)
ftp -n -v EOF # -n 自动登录
open 192.168.1.10 # ftp服务器
user admin password
binary # 设置ftp传输模式为二进制避免MD5值不同或.tar.gz压缩包格式错误
cd $dir
get $file
EOF扫描主机端口状态
#!/bin/bash
HOST$1
PORT22 25 80 8080
for PORT in $PORT; do
if echo /dev/null /dev/tcp/$HOST/$PORT; then
echo $PORT open
else
echo $PORT close
fi
done用 shell 打印示例语句中字母数小于6的单词
#示例语句
#Bash also interprets a number of multi-character options.
#!/bin/bash
##############################################################
#shell打印示例语句中字母数小于6的单词
##############################################################
for s in Bash also interprets a number of multi-character options.
do
necho $s|wc -c
if [ $n -lt 6 ]
then
echo $s
fi
done监控 httpd 的进程数根据监控情况做相应处理
#!/bin/bash
###############################################################################################################################
#需求
#1.每隔10s监控httpd的进程数若进程数大于等于500则自动重启Apache服务并检测服务是否重启成功
#2.若未成功则需要再次启动若重启5次依旧没有成功则向管理员发送告警邮件并退出检测
#3.如果启动成功则等待1分钟后再次检测httpd进程数若进程数正常则恢复正常检测10s一次否则放弃重启并向管理员发送告警邮件并退出检测
###############################################################################################################################
#计数器函数
check_service()
{
j0
for i in seq 1 5
do
#重启Apache的命令/usr/local/apache2/bin/apachectl restart 2 /var/log/httpderr.log
#判断服务是否重启成功
if [ $? -eq 0 ] thenbreak
else
j$[$j1] fi
#判断服务是否已尝试重启5次
if [ $j -eq 5 ] thenmail.py exit
fi
done }while :do
npgrep -l httpd|wc -l
#判断httpd服务进程数是否超过500
if [ $n -gt 500 ] then/usr/local/apache2/bin/apachectl restart
if [ $? -ne 0 ]
thencheck_service
else
sleep 60
n2pgrep -l httpd|wc -l
#判断重启后是否依旧超过500
if [ $n2 -gt 500 ]
then mail.py exit
fi
fi
fi
#每隔10s检测一次
sleep 10doneiptables 自动屏蔽访问网站频繁的IP
场景恶意访问,安全防范
1屏蔽每分钟访问超过200的IP
方法1根据访问日志Nginx为例
#!/bin/bash
DATE$(date %d/%b/%Y:%H:%M)
ABNORMAL_IP$(tail -n5000 access.log |grep $DATE |awk {a[$1]}END{for(i in a)if(a[i]100)print i})
#先tail防止文件过大读取慢数字可调整每分钟最大的访问量。awk不能直接过滤日志因为包含特殊字符。
for IP in $ABNORMAL_IP; do
if [ $(iptables -vnL |grep -c $IP) -eq 0 ]; theniptables -I INPUT -s $IP -j DROP fidone方法2通过TCP建立的连接
#!/bin/bash
ABNORMAL_IP$(netstat -an |awk $4~/:80$/ $6~/ESTABLISHED/{gsub(/:[0-9]/,,$5);{a[$5]}}END{for(i in a)if(a[i]100)print i})
#gsub是将第五列客户端IP的冒号和端口去掉
for IP in $ABNORMAL_IP; do
if [ $(iptables -vnL |grep -c $IP) -eq 0 ]; theniptables -I INPUT -s $IP -j DROP
fi
done2屏蔽每分钟SSH尝试登录超过10次的IP
方法1通过lastb获取登录状态:
#!/bin/bash
DATE$(date %a %b %e %H:%M) #星期月天时分 %e单数字时显示7而%d显示07
ABNORMAL_IP$(lastb |grep $DATE |awk {a[$3]}END{for(i in a)if(a[i]10)print i})for IP in $ABNORMAL_IP; do
if [ $(iptables -vnL |grep -c $IP) -eq 0 ]; theniptables -I INPUT -s $IP -j DROP fidone方法2通过日志获取登录状态
#!/bin/bash
DATE$(date %b %d %H)
ABNORMAL_IP$(tail -n10000 /var/log/auth.log |grep $DATE |awk /Failed/{a[$(NF-3)]}END{for(i in a)if(a[i]5)print i})
for IP in $ABNORMAL_IP; do
if [ $(iptables -vnL |grep -c $IP) -eq 0 ]; theniptables -A INPUT -s $IP -j DROP
echo $(date %F %T) - iptables -A INPUT -s $IP -j DROP ~/ssh-login-limit.log
fi
done根据web访问日志封禁请求量异常的IP如IP在半小时后恢复正常则解除封禁
#!/bin/bash
####################################################################################
#根据web访问日志封禁请求量异常的IP如IP在半小时后恢复正常则解除封禁
####################################################################################
logfile/data/log/access.log
#显示一分钟前的小时和分钟
d1date -d -1 minute %H%M
d2date %M
ipt/sbin/iptables
ips/tmp/ips.txt
block()
{
#将一分钟前的日志全部过滤出来并提取IP以及统计访问次数
grep $d1: $logfile|awk {print $1}|sort -n|uniq -c|sort -n $ips
#利用for循环将次数超过100的IP依次遍历出来并予以封禁
for i in awk $1100 {print $2} $ips
do
$ipt -I INPUT -p tcp --dport 80 -s $i -j REJECT
echo date %F-%T $i /tmp/badip.log
done
}
unblock()
{
#将封禁后所产生的pkts数量小于10的IP依次遍历予以解封
for a in $ipt -nvL INPUT --line-numbers |grep 0.0.0.0/0|awk $210 {print $1}|sort -nr
do
$ipt -D INPUT $a
done
$ipt -Z
}
#当时间在00分以及30分时执行解封函数
if [ $d2 -eq 00 ] || [ $d2 -eq 30 ]
then
#要先解再封因为刚刚封禁时产生的pkts数量很少unblockblock
elseblock
fi判断用户输入的是否为IP地址
方法1:
#!/bin/bash
function check_ip(){
IP$1
VALID_CHECK$(echo $IP|awk -F. $1 255$2255$3255$4255{print yes})
if echo $IP|grep -E ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/dev/null; then
if [ $VALID_CHECK yes ]; then
echo $IP available.
else
echo $IP not available!
fi
else
echo Format error!
fi
}
check_ip 192.168.1.1
check_ip 256.1.1.1方法2
#!/bin/bash
function check_ip(){
IP$1
if [[ $IP ~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
FIELD1$(echo $IP|cut -d. -f1)
FIELD2$(echo $IP|cut -d. -f2)
FIELD3$(echo $IP|cut -d. -f3)
FIELD4$(echo $IP|cut -d. -f4)
if [ $FIELD1 -le 255 -a $FIELD2 -le 255 -a $FIELD3 -le 255 -a $FIELD4 -le 255 ]; then
echo $IP available.
else
echo $IP not available!
fi
else
echo Format error!
fi
}
check_ip 192.168.1.1
check_ip 256.1.1.1增加版 加个死循环如果IP可用就退出不可用提示继续输入并使用awk判断。
#!/bin/bash
function check_ip(){local IP$1
VALID_CHECK$(echo $IP|awk -F. $1 255$2255$3255$4255{print yes})
if echo $IP|grep -E ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ /dev/null; then
if [ $VALID_CHECK yes ]; thenreturn 0
else
echo $IP not available!return 1
fi
else
echo Format error! Please input again.return 1
fi
}
while true; doread -p Please enter IP: IPcheck_ip $IP[ $? -eq 0 ] break || continue
done