Q-Logo 我的学习笔记分享

树莓派脚本直接执行正常,放到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不会自行处理环境变量,需要用户在脚本中对环境变量进行设置。查看日志是追踪和解决问题的有效办法。

数据无价,必须自动、及时、有效进行备份。设置完自动备份功能后,不能就不管不顾了,需要定期认为检查备份的数据是否正常,有问题及时处理。