Chinaunix

标题: 一个同步日志的脚本 [打印本页]

作者: rdcwayx    时间: 2013-10-16 08:02
标题: 一个同步日志的脚本
本帖最后由 rdcwayx 于 2013-10-16 10:03 编辑

看到 @刺客阿地 的这个帖子, 很不错的话题,但埋没在其他帖子里,不被注意。我重新起个帖子来讨论一下。

http://bbs.chinaunix.net/forum.p ... 2&fromuid=28783

原文:

正好借这个帖子,我问个脚本问题。
  1. #!/bin/bash
  2. #create xxx  
  3. btime=`date -d "-1 day" +%y-%m-%d`
  4. atime=`date -d "-1 day" +%Y-%m-%d`
  5. ctime=`date +%Y%m%d`
  6. dtime=`date -d "-1 day" +%Y%m%d`
  7. #rsync www server
  8. rsync -vzrtopgl --progress --password-file=/etc/rsyncd.passwd moon_web@192.168.0.48::benlog/catalina_log.$btime /opt/log/48_ben/ben/
  9. rsync -vzrtopgl --progress --password-file=/etc/rsyncd.passwd moon_web@192.168.0.49::benlog/catalina_log.$btime /opt/log/49_ben/ben/
  10. rsync -vzrtopgl --progress --password-file=/etc/rsyncd.passwd moon_web@192.168.0.51::beforelog/catalina_log.$btime /opt/log/51_before/before/
  11. rsync -vzrtopgl --progress --password-file=/etc/rsyncd.passwd moon_web@192.168.0.55::beforelog/catalina_log.$btime /opt/log/55_before/before/

  12. rsync -vzrtopgl --progress --password-file=/etc/rsyncd.passwd moon_web@192.168.0.52::pagservicelog/catalina_log.$btime /opt/log/52_pag/pag/
  13. rsync -vzrtopgl --progress --password-file=/etc/rsyncd.passwd moon_web@192.168.0.56::pagerservicelog/catalina_log.$btime /opt/log/56_pag/pag/

  14. rsync -vzrtopgl --progress --password-file=/etc/rsyncd.passwd moon_web@192.168.0.53::paylog/catalina_log.$btime /opt/log/53_pay/pay/
  15. rsync -vzrtopgl --progress --password-file=/etc/rsyncd.passwd moon_web@192.168.0.57::paylog/catalina_log.$btime /opt/log/57_pay/pay/

  16. rsync -vzrtopgl --progress --password-file=/etc/rsyncd.passwd moon_web@192.168.0.54::mentlog/catalina_log.$btime /opt/log/54_ment/ment/
  17. rsync -vzrtopgl --progress --password-file=/etc/rsyncd.passwd moon_web@192.168.0.58::mentlog/catalina_log.$btime /opt/log/58_ment/ment/
复制代码
这是一个同步日志的脚本,我想做到的是,怎么样才能让他自动识别我需要下载的日志?

比方说我想下载48,49这两台机器的日志,如何让程序自动去下载判别呢?

作者: Shell_HAT    时间: 2013-10-16 08:12
不知道他的疑问到底在什么地方
作者: rdcwayx    时间: 2013-10-16 08:21
本帖最后由 rdcwayx 于 2013-10-16 13:14 编辑

我的思路是: 

先建个列表:
  1. $ cat server.list
  2. moon_web 192.168.0.48  ben
  3. moon_web 192.168.0.49  ben
  4. moon_web 192.168.0.51  before
  5. moon_web 192.168.0.52  pagservice
  6. moon_web 192.168.0.53  pay
  7. moon_web 192.168.0.54  ment
  8. moon_web 192.168.0.55  before
  9. moon_web 192.168.0.56  pagerservice
  10. moon_web 192.168.0.57  pay
  11. moon_web 192.168.0.58  ment

复制代码
再简化程序:
  1. #!/bin/bash
  2. #create xxx  

  3. # Usage: $0 IP1 IP2 IP3 ...

  4. btime=`date -d "-1 day" +%y-%m-%d`
  5. atime=`date -d "-1 day" +%Y-%m-%d`
  6. ctime=`date +%Y%m%d`
  7. dtime=`date -d "-1 day" +%Y%m%d`

  8. list=$*                                                                       # 将脚本后面的参数引入, 也就是服务器IP 列表

  9. #rsync www server
  10. for server in $list
  11. do
  12.     grep " $server " server.list |while read user IP key X    # 将 server.list 按照IP过滤后,分配给三个变量: user, IP, key。 X 用来避免干扰,如果文件后有多余的字符。
  13.     do
  14.         id=${IP##*.}                                                     # 取出 IP 地址 的最后一个字段,比如48, 或者49, 因为后面的目录名里含这个。
  15.         rsync -vzrtopgl --progress --password-file=/etc/rsyncd.passwd ${user}@${IP}::${key}log/catalina_log.$btime /opt/log/${id}_${key}/${key}/           # 这个就是对各个变量的引入。 理解了上面的代码,这个就好理解了。
  16.     done
  17. done
复制代码
运行的时候,只要跟上IP地址即可
  1. test.sh 192.168.0.48 192.168.0.49
复制代码

作者: bikong0411    时间: 2013-10-16 09:13
就是个根据ip选择的过程吧
作者: 刺客阿地    时间: 2013-10-16 10:11
@rdcwayx感谢版主,版主对我脚本想要的结果,分析的很到位。

我的意思就是想运行脚本,然后根据IP或者工程名字去做运行,这样的话,每次想同步哪台机器,就直接运行脚本,加上IP地址或者工程名字,有选择的去运行自己想要同步的机器日志即可。

感谢版主,感谢大家的回答!
作者: 刺客阿地    时间: 2013-10-16 10:12
不知道还有没更简化的方法
作者: 刺客阿地    时间: 2013-10-16 10:15
回复 4# bikong0411

这脚本简化后,当中有些变量用的,我看不懂。。。基本公共不扎实,要下功夫了。。。{:3_185:}

   
作者: rdcwayx    时间: 2013-10-16 10:21
如果还要简化的话,那么就要改一下日志的输出结构了。

比如,每个服务器上都建个单独的日志归档目录 /logs, 在logs目录下建子目录设定不同的工程名字。 每个应用的logs 目录都建链接到这个/logs/子工程目录下, 这样的话,只需要对最上层的logs 目录同步即可,所有子目录自动获得更新。代码也会更简单。

这个只需要做一次设定即可。

  1. login 192.168.0.48
  2. mkdir -p /logs/benlog
  3. ln -s /logs/benlog /PATH/benlog
复制代码

作者: 刺客阿地    时间: 2013-10-16 10:36
回复 8# rdcwayx

嗯,感谢,这方法确实不错。我会尝试的。


   
作者: 刺客阿地    时间: 2013-10-16 11:04
@rdcwayx版主,你写的这个脚本,当中有很多地方我没明白,所以在这里不耻下问一下,基础不牢,还望见谅。
server.list这个表建立,是个思路,表当中包含IP地址,工程名字,rsync的账户名。
list=$*

#rsync www server
for server in $list
do
    grep " $server " server.list |while read user IP key X
    do
        id=${IP##*.}
        rsync -vzrtopgl --progress --password-file=/etc/rsyncd.passwd ${user}@${IP}:{key}log/catalina_log.$btime /opt/log/${id}_${key}/${key}/
    done
done
这一段当中,list=$*是什么意思 ,还有$server   server.list,  id=${IP##*.}     ${user}@${IP}:{key}   ${id}_${key}/${key}/

这些地方的变量,我都有点不明白了,新手,不好意思,在这里笨笨的问一下,谢谢!
作者: rdcwayx    时间: 2013-10-16 11:12
回复 10# 刺客阿地
我在三楼代码里加了备注,你再看一下, 可以帮助理解。

   
作者: 刺客阿地    时间: 2013-10-16 11:40
回复 11# rdcwayx

感谢您的无私奉献帮助精神,{:3_189:} ,以后要多向您学习请教了。我会常来shell版提问题和帮助他人解决自己有能力解决的问题,哈哈!
作者: rdcwayx    时间: 2013-10-16 11:51
多来论坛交流啊。
作者: 刺客阿地    时间: 2013-10-16 11:56
回复 11# rdcwayx


  我又要再追问一个问题了,按照您的这个脚本,我如果改成你写的这个模式之后,可以有选择的去下载不同服务器的日志,那么我如果下下载全部服务器的日志,执行您这个脚本之后,不加IP,是否能同步全部的服务器日志?
作者: rdcwayx    时间: 2013-10-16 14:05
那么这样做:
  1. if [ $1 == "" ] ;then
  2.     while read user IP key X    # 将 server.list 按照IP过滤后,分配给三个变量: user, IP, key。 X 用来避免干扰,如果文件后有多余的字符。
  3.     do
  4.         id=${IP##*.}                                                     # 取出 IP 地址 的最后一个字段,比如48, 或者49, 因为后面的目录名里含这个。
  5.         rsync -vzrtopgl --progress --password-file=/etc/rsyncd.passwd ${user}@${IP}::${key}log/catalina_log.$btime /opt/log/${id}_${key}/${key}/           # 这个就是对各个变量的引入。 理解了上面的代码,这个就好理解了。
  6.     done < server.list
  7. else
  8.     #    for loop
  9. fi
复制代码

作者: 刺客阿地    时间: 2013-10-16 15:41
回复 16# rdcwayx


    这样改了以后,可以选择IP去下载需要的日志,也可以同步全部机器的日志了对吧,版主是高手。哈哈!
作者: zhangyuqing123    时间: 2014-02-18 11:02
你好,看到你的帖子,受益很多,能否加QQ一起讨论下啊?我的QQ 2497321200




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2