今天在测试cron定时任务实现rsync自动备份时,先将以下命令写入脚本~/etc_backup.sh:
#!/bin/bash
rsync -avz /etc rsync_backup@172.16.1.41::backup
然后执行crontab -e命令,在里面添加如下命令,设置每3分钟定时执行etc_backup.sh脚本,实现备份:
*3/ * * * * /usr/bin/sh ~/etc_backup.sh
3分钟后,发现rsync服务端备份目录里没有接收到数据,查看客户端的日志文件/etc/log/cron,确实执行了脚本,为了排除是cron的问题,利用ls来测试:
#!/bin/bash
ls -l /etc > ~/test.txt
然后在crontab -e里添加:
*/3 * * * * /usr/bin/sh ~/test.sh
时间一到,查看~/test.txt文件,得到预期结果,确定cron没有问题,问题应该出在etc_backup.sh脚本,再仔细看脚本里的命令,发现省略了–password-file=/etc/rsync.password文件所致,于是把脚本文件命令改成:
rsync -avz /etc rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
即可实现定时备份。
原因分析:我在设置rsync客户端密码文件时,使用:
echo 'export RSYNC_PASSWORD=oldboy' >>/etc/bashrc
设置了环境变量,所以在命令行界面实现手动备份时,可以省略密码:
[root@nfs ~]#rsync -avz /etc rsync_backup@172.16.1.41::backup
但是写进脚本时,由于脚本执行没有自动检查环境变量,所以无法获取到服务端的密码,这才导致无法备份成功,后来加了–password-file=/etc/rsync.password指定密码文件后,即可执行成功。