来源:自学PHP网 时间:2015-04-14 11:12 作者: 阅读:次
[导读] 自动连接多台机器并搜寻日志的脚本我们应用部署在10台机器上,对应地日志文件也分散在这10台上。若想从这10份日志文件中,搜索,如报错信息,是比较常见的需求。下面的脚本干的...
自动连接多台机器并搜寻日志的脚本
我们应用部署在10台机器上,对应地日志文件也分散在这10台上。若想从这10份日志文件中,搜索,如报错信息,是比较常见的需求。
下面的脚本干的就是这事儿。大体逻辑十分简单:
Pseudocode:
for hostname in (10台机器):
ssh连接远程host
从日志文件中找出符合条件的行并写到本地文件中
看似简单,但对于shell编程生疏的我来讲,有以下两个难点:
1. 如何ssh时,不需要手动输入passphase/password
2. 如何结束当前ssh session后,继续开启下一个ssh session
google了半天,运气算好,搞定了,解决方案如下:
1. 如何ssh时,不需要手动输入passphase/password?
用ssh-agent!此进程启动后,只需手动输入passphase一次,则ssh-agent就会记住你的passphase,后面连接远程机子时,它会自动从记忆中读取,不需要人为再次输入了。
环境设置如下:
1) 生成public/private key pairs:
$ssh-keygen -t dsa
2) 把生成的public key (id_dsa.pub)放到10台远程机器上
$scp .ssh/id_dsa.pub username@hostname:.ssh/authorized_keys (10次)
3) 确保ssh-agent已启动,若无,则启动:
$ps aux | grep ssh-agent #check if it`s running
$eval `ssh-agent` #if not, start up the agent process
4) 向ssh-agent提交你的passphase:
$ssh-add
5) 把ssh-agent相关信息保存到变量中,以便在执行脚本时导入引用:
$ssh-agent -s > ~/.bashrc
6) 脚本中记得引入变量即可,如:
$source ~/.bashrc
2. 如何结束当前ssh session后,继续开启下一个ssh session?
<<"EOF"
EOF
具体原理,后面再补充!
到此,整个可执行脚本就出来了。再在crontab -e里写上一行,轻轻松松让它每天自动收集报错信息并发邮件给俺!
脚本附上,写得实在是粗陋,随便嫌弃哈,不用对我客气!
顺便,若有更简洁的解决方案,求不吝赐教!
#!/bin/bash
source ~/.bashrc
hostfile="/home/bai/host_videoapi" #一机器一行
keyword="fail@" #查询的关键字
search_log="videoapi.log" #查寻的日志文件名
outputfile="error_videoapi.log" #output file
#挨个儿连接并搜寻错误信息
while read line
do
vahost=$line
echo "---hostname:" $vahost "-----" >> $outputfile
ssh $vahost "find /home/videoapi/logs -type f -name $search_log -exec grep -i $keyword {} \; -print " >> $outputfile <<"EOF"
EOF
echo "---finishing-----"
done < $hostfile
#查看是否有错误信息,有则发邮件,无则done nothing
if grep -q $keyword $outputfile
then
mail -s "errors in videoapi!" bai@126.com < $error_log
else
echo "it is a nice day!"
fi
|
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com