使用 cron 执行的 Shell 脚本会产生与手动执行不同大小的文件

使用 cron 执行的 Shell 脚本会产生与手动执行不同大小的文件

我有一台运行 MySQL 数据库的 RHEL 服务器。我有一个执行的 Bash 脚本mysqldump来创建备份文件。直接在 Bash 中执行脚本时创建的备份文件大小为 754259 字节。如果通过 cron 运行相同的脚本,则其大小只有 20 个字节。

据我所知, cron 运行的用户上下文与我登录手动运行脚本时使用的用户上下文相同。然而,考虑到尺寸差异,这似乎并非如此。

为什么运行相同的脚本时文件大小不同?

shell脚本内容:

backup_path=/var/custom/db_backups
configFile=/var/custom/auth.cnf
db_name=[db_name]
date=$(date +"%d-%b-%Y")

sudo /opt/rh/mysql55/root/usr/bin/mysqldump --defaults-extra-file=$configFile $db_name | gzip -9  > $backup_path/$db_name-$date.sql.gz

编辑 cron:

sudo crontab -e

cron 文件内容:

12 21 * * * /var/custom/maint_plan

这会在每天晚上 9:13 执行该脚本。

答案1

mysqldump命令不返回任何内容,它通过管道传输gzip并以空的 gzip 文件结尾。看:

$ echo -n "" | gzip -9  > test.gz
$ stat -c %s test.gz
20

这会生成一个大小为 20 字节的文件。所以问题出在mysqldump命令上。由于它是 root 的 crontab,因此该脚本以 root 权限运行。sudo没有必要。使用它,无需sudo.只是:

/opt/rh/mysql55/root/usr/bin/mysqldump --defaults-extra-file=$configFile $db_name | gzip -9  > $backup_path/$db_name-$date.sql.gz

答案2

通过 cron 运行的脚本失败。 20 字节是空 MySQL 转储的大小。

答案3

cron 运行脚本的环境非常有限。它可能找不到所有必需的程序。捕获获得良好转储的 shell 的环境变量,并将其转移到 cron 脚本中。

相关内容