zoukankan      html  css  js  c++  java
  • Linux下通过crontab及expect实现自动化处理

    目录(?)[+]

    目标

    为实现每天定时从其他服务器上复制文件到本地,需要使用crontab建立定时任务,并通过scp进行Linux之间的文件复制。在复制文件时,可能需要输入目标服务器上的密码,通过expect即可实现。

    步骤说明

    准备工作

    检查并安装expect及tcl
    说明:expect命令行工具,可在交互式操作的场景下实现复杂的自动化处理功能。expect依赖tcl。

    • 下载expect和tcl
      expect和tcl的版本及具体下载地址:
      expect版本 5.43 - expect-5.43.0.tar.gz
      tcl版本 8.4.19 -tcl8.4.19-src.tar.gz

    • 安装tcl
      解压tar.gz文件,然后进入解压后tcl目录(假设为:/usr/src/tcl8.4.19)。

    #进入unix子目录,并执行编译、安装
    > cd unix
    > ./configure
    > make
    > make install 
    • 1
    • 2
    • 3
    • 4
    • 5
    • 1
    • 2
    • 3
    • 4
    • 5
    • 安装expect
    #进入expect解压后的目录
    > ./configure --with-tclinclude=/usr/src/tcl8.4.19/generic/ --with-tclconfig=/usr/local/lib/
    > make
    > make install
    # 安装完毕,测试expect,显示如下则成功。
    > expect
    expect1.1>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    编写处理脚本

    实现功能:在远程数据库上执行expdp导出dmp文件,并复制到本地指定位置。因每天都会执行,需要生成有日期后缀的文件。

    #!/bin/bash
    #获取当前日期
    curr_date=$(date '+%y%m%d')
    echo $curr_date
    
    #1.expdp导出,下述/home/.../bin/为expdp所在目录
    export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_1/
    /home/.../bin/expdp olduser/password@10.0.1.1/orcl directory=DATA_PUMP_DIR dumpfile=expdb_${curr_date}.dmp logfile=expdb${curr_date}.log SCHEMAS=olduser
    
    #2.复制到本地服务器
    /usr/local/bin/expect <<!
    spawn scp -P22 oracle@10.0.1.1:/u01/app/oracle/dpdump/expdb_${curr_date}.dmp /home/oracle/dbbackup/
    #此命令后,可能需要输入远程服务器的用户密码
    set timeout 300 #设置超时300秒
    expect "oracle@10.0.1.1's password:"
    set timeout 300
    send "password
    " #发送密码
    set timeout 3600 #验证通过后,远程服务器进行dump操作,耗时可能比较长
    send "exit
    " #完毕后,断开连接
    expect eof
    !
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    保存以上文件为bakbash(假设位于:/usr/local/bin/目录),然后用chmod命令设置可执行权限:

    chmod 755 bakbash
    • 1
    • 1

    创建定时任务

    crontab -l #查看当前用户的定时任务
    crontab -e #编辑当前用户的定损任务
    #在vi 界面,添加一行:每日凌晨2点执行bakbash脚本
    0 2 * * * /usr/local/bin/bakbash
    
    #修改crontab之后,可能需要重启cron服务
    su -root password
    /etc/init.d/crond restart
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    至此,即完成了任务配置及脚本自动处理。

    总结

    • 在/bin/bash中使用expect,可采用如下方式:
    #!/bin/bash
    expect <<!
    ## expect命令 ##
    !
    • 1
    • 2
    • 3
    • 4
    • 1
    • 2
    • 3
    • 4
    • Crontab 编辑后,并不需要restart。
    • 报错信息:/bin/sh: bakbash: command not found,这是因为之前将bakbash脚本放在了其他目录下,导致bash脚本无法找到该命令,将文件转移到/usr/local/bin/目录后, 即可找到。另外,在bakbash中使用到的 expdp, expect命令,都需要有明确的路径前缀,否则也会找不到命令。这是因为crontab在执行的时候只会定义少数环境变量而不是继承用户shell环境中的环境变量

    延伸阅读

    关于expect命令的介绍,参见:
    http://os.51cto.com/art/201012/240260.htm
    http://blog.csdn.net/qujinhua19851006/article/details/8666324

    关于Linux之间的数据传输方式(rcp/scp等)及比较,参见:
    http://blog.csdn.net/qujinhua19851006/article/details/8666254

    http://blog.csdn.net/pierre_/article/details/45647973

  • 相关阅读:
    威尔逊定理  知识点
    费马小定理及推论 知识点
    勾股定理和勾股数
    hdu6441 Find Integer (费马大定理)
    费马大定理
    莫队算法 [国家集训队]小Z的袜子
    R49 A-D D图有向有环图
    #505 1&2 A-C 后面未完成
    stack 的一些用法
    bzoj 2844 albus就是要第一个出场 异或和出现次数 线性基
  • 原文地址:https://www.cnblogs.com/seasonzone/p/5691707.html
Copyright © 2011-2022 走看看