Cron 作业在启动时无法正常工作

Cron 作业在启动时无法正常工作

感谢您阅读本文。

我创建了一个 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 没有包含mysqlmysqldump所在的目录。

或者,您可以在脚本中引用这些命令时使用完整路径,例如,/usr/bin/mysql在脚本开头创建一个新的 PATH 变量:

export PATH=/bin:/usr/bin

或者指向任何其他目录mysqlmysqldump如果您没有使用默认的 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 由于某种原因从未启动,脚本将永远循环。

相关内容