感谢您阅读本文。
我创建了一个 bash 脚本来备份我的数据库。该脚本将创建一个当天的目录,然后为该目录中的每个数据库创建一个备份文件。
如果我从命令行调用它,它会按预期运行。
我希望它在机器启动时运行,所以我创建了一个 cron 作业来运行它。
当 cron 作业运行时,它会创建目录但不会创建文件。
我检查了系统日志,可以看到 cron 作业正在处理,但没有输出表明有错误。有一条消息似乎表明,如果安装了 postfix 或类似程序,则会发送电子邮件。除非真的必须,否则我真的不想安装 postfix。
还有其他我可以查看的日志吗?
这是 cron 作业(以 root 身份运行):
@reboot /usr/bin/db.backup.sh
这是 bash 脚本:
#!/bin/bash
DB_BACKUP="/files/database_backups/`date +%Y-%m-%d`"
DB_USER="root"
DB_PASSWD="a"
HN=`hostname | awk -F. '{print $1}'`
# Create the backup directory
mkdir -p $DB_BACKUP
# Remove backups older than 10 days
find /files/database_backups/ -maxdepth 1 -type d -mtime +10 -exec rm -rf {} \;
# Backup each database on the system
for db in $(mysql --user=$DB_USER --password=$DB_PASSWD -e 'show databases' -s --skip-column-names|grep -viE '(staging|performance_schema|information_schema)');
do mysqldump --max-allowed-packet=1073741824 --user=$DB_USER --password=$DB_PASSWD --events --opt --single-transaction $db | gzip > "$DB_BACKUP/$db-$(date +%Y-%m-%d).sql.gz";
chown -R www-data:www-data $DB_BACKUP
done
答案1
在 cron 下运行的脚本与从命令行运行的脚本具有不同的环境。
这可能是因为 cron 下定义的 PATH 没有包含mysql
和mysqldump
所在的目录。
或者,您可以在脚本中引用这些命令时使用完整路径,例如,/usr/bin/mysql
在脚本开头创建一个新的 PATH 变量:
export PATH=/bin:/usr/bin
或者指向任何其他目录mysql和mysqldump如果您没有使用默认的 Ubuntu 包安装 MySQL,则会安装。
为了保留从 cron 运行脚本时可能产生的错误消息,如果您没有在本地收到邮件,您可以简单地将输出重定向添加到您的 crontab 定义中,如下所示:
@reboot /usr/bin/db.backup.sh >/tmp/db-backup.log 2>&1
任何消息、信息和错误,稍后都会被发现/tmp/db-backup.log
。
如果您想要附加信息并且不在每次执行时覆盖日志文件,请考虑在上面的行中使用“>>”而不是“>”。
更新:如果在 MySQL 服务器启动之前运行 cron 任务
如果脚本在机器启动过程中运行,在 MySQL 服务器启动之前,可以在脚本开头执行一个小检查,等待 MySQL 套接字文件出现:
while [ ! -e /var/run/mysqld/mysqld.sock]; do
# if the file doesn't exist, will loop
do
注意力:如果 MySQL 由于某种原因从未启动,脚本将永远循环。