Linux下通过crontab及expect实现自动化处理
2016-07-21 14:41
441 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。
目录(?)[+]
说明: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)。
1
2
3
4
5
1
2
3
4
5
安装expect
1
2
3
4
5
6
7
1
2
3
4
5
6
7
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命令设置可执行权限:
1
1
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
至此,即完成了任务配置及脚本自动处理。
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环境中的环境变量。
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
目录(?)[+]
目标
为实现每天定时从其他服务器上复制文件到本地,需要使用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\r" #发送密码 set timeout 3600 #验证通过后,远程服务器进行dump操作,耗时可能比较长 send "exit\r" #完毕后,断开连接 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
相关文章推荐
- centos 安装软件的方法
- PIPO管道通信范列(linux)
- Linux系统调用--mmap/munmap函数详解【转】
- FreeBSD和linux下/proc 目录介绍
- linux、python、exvim相关软件下载
- 转:linux下共享库的注意点之-fpic
- linux历史发展
- Linux + python +mysqlDB + mysql + innoDB
- Linux命令-less
- Linux中zip压缩和unzip解压缩命令详解
- centOS 7安装后无法上网+虚拟机不能安装问题解决
- 解决CentOS启动提示unexpected inconsistency;RUN fsck MANUALLY的问题
- Linux绝技
- Linux查看版本或发行版本
- linux下find(文件查找)命令的用法总结
- linux下如何查询系统信息?
- CentOS7安装mysql数据库
- LINUX诞生
- linux 压缩、解压缩命令
- 一段关于 Unix、Linux 和 Windows 的暗黑史