树莓派脚本直接执行正常,放到crontab就不正常的问题解决
前几天用家中的树莓派采用SQL转储和增量备份的方式,对云服务器上的数据库和文件进行了定时备份。当时写了个backup.sh的脚本,里面主要通过以下两个语句进行备份
docker-compose run db pg_dump -d 'postgresql://name:password@x.x.x.x/db' > databak/bak.sql
rsync -vzrtopg --progress --delete -e "ssh -p 22" qq@x.x.x.x:/media/ /media/ >/dev/null 2>&1
手动执行脚本正常后,将其放到crontab后,就没再管它。昨天查看了以下备份的结果,发现文件的增量备份一切正常,但SQL转储的数据库备份的.sql文件虽然生成了,但大小是0。这就奇怪了。
数据是无价的,这个问题必须解决,于是对问题进行了排查。以下为排查过程记录
确认脚本直接运行正常
手动通过绝对路径执行备份脚本 backup.sh ,确认脚本直接运行能正常备份,生成的.sql文件不为0,用cat 查看其内容正常。
查看cron的日志。
树莓派的系统日志默认存储在 /var/log/syslog ,但其内容不只有cron日志,为了便于排查,可以将日志重定向到 /var/log/cron.log 。运行以下命令编辑/etc/rsyslog.conf文件
sudo vi /etc/rsyslog.conf
在其中找到
#cron.* /var/log/cron.log
这行,删除表示注释的#号,保存退出。运行以下命令重启rsyslog服务
sudo /etc/init.d/rsyslog restart
然后可以在 /var/log/cron.log 查看日志信息 。发现其中没有提供太多有用信息,但有一句
(CRON) info (No MTA installed, discarding output)
这个报错是由于没有配置邮件服务器,解决方式是安装postfix
sudo apt-get install postfix
选Local Only,确定安装。然后配置
sudo dpkg-reconfigure postfix
一路确定即可。
然后,再次crontab –e修改计划任务表,增加一行两分钟后的运行此脚本的计划任务。再sudo /etc/init.d/cron restart重启计划任务,等待两分钟后, 命令执行。 Bash界面中收到如下通知
您在 /var/mail/pi 中有邮件
运行如下命令查看邮件
cat /var/mail/pi
其中有以下内容
/home/pi/qcloudfunback/backup.sh:行7: docker-compose:未找到命令
也就是说,运行docker-compose时,没找到命令,看起来是环境变量的问题。
修改backup.sh脚本导入环境变量
编辑backup.sh在文件中靠前的位置继续增加导入环境变量的语句
. /etc/profile
. /home/pi/.profile
然后,crontab –e修改计划任务表,增加一行两分钟后的运行此脚本的计划任务。再sudo /etc/init.d/cron restart重启计划任务
等待两分钟后,生成的SQL转储文件大小正常了。
总结
这次的问题是使用crontab时的一个常见问题,crontab不会自行处理环境变量,需要用户在脚本中对环境变量进行设置。查看日志是追踪和解决问题的有效办法。
数据无价,必须自动、及时、有效进行备份。设置完自动备份功能后,不能就不管不顾了,需要定期认为检查备份的数据是否正常,有问题及时处理。