mysqldump 脚本在 cron 中不起作用

mysqldump 脚本在 cron 中不起作用

我一直在思考为什么特定脚本在 cron 中运行的各种问题,但到目前为止没有任何答案可以帮助我。所以我只是尝试运行一个 mysqldump 脚本,现在看起来像这样:

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# you must pass arguments to this script
if [ $# -eq 0 ]
        then
                echo "No arguments supplied"
                exit 1
fi

# if a path is supplied, perform the mysqldump to that directory
today=`date +%m-%d-%Y`
mysqldump --defaults-file=/home/<user>/.my.cnf --databases 360_projects --single-transaction --add-drop-database --triggers --routines -u BACKUPUSER > $1pmbackup${today}.sql

请注意,我添加了显式路径,让它知道我想在 bash 中运行它,并在 mysqldump 中手动指定配置文件的路径,以防 cron 无法获取它。到目前为止,这些都没有任何帮助。

最后是我的 crontab,我使用它来调用它,crontab -e以便在我退出编辑器时自动安装。

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Backup of MySQL Database every 4th Hour, Locally, Remotely
6 11 * * * /bin/bash /home/<user>/Scripts/sql-backup.sh /media/mysqlBackup-Daily/

我当然已经确保我的脚本归此 crontab 所属的用户所有,并且权限设置为 rwxr,所以我真的不确定这里出了什么问题。

当我尝试测试它时,/var/log/cron 在特定时间的输出:

Aug 21 14:06:01 www5 crond[1305]: (<user>) RELOAD (/var/spool/cron/<user>)

编辑:目前最好的问题可能就是如何从 cron 作业中获取更详细的输出。现在,我得到的只是一行告诉我它已重新加载(见上文)。

编辑于 2018 年 8 月 27 日:我注意到建议使用记录器来获取更详细的输出,但这似乎不起作用。我的错误现在更改为:

Aug 27 13:55:01 www5 crond[1305]: (php) ERROR (getpwnam() failed)

从命令中:

*/5 10 * * * /bin/bash /home/<user>/Scripts/sql-backup.sh /media/vantecBackup1/mysqlBackup-Daily/ 2>&1 | /usr/bin/logger -t sql_daily_backup

您如何看待这个错误?由于该脚本不使用 php,因此对我来说这没什么意义。谢谢。

答案1

在文件脚本中,您必须passs( -p PASSWORD)在命令 mysqldump 上添加选项,因为运行脚本时您可以输入密码,因此脚本不会运行。您可以使用选项将命令重新添加到脚本中-p

mysqldump --defaults-file=/home/<user>/.my.cnf --databases 360_projects --single-transaction --add-drop-database --triggers --routines -u BACKUPUSER -p PASSWORD > $1pmbackup${today}.sql

我认为脚本和 cron 自动运行。

答案2

使用 logger 输出 cron 脚本的结果。请参阅https://serverfault.com/a/434902/470077

这将为您提供一些线索,让您知道您实际上应该做什么。否则,我们只是猜测哪里出了问题。

答案3

非常感谢所有帮助过我的人,我花了很多时间调试才修复了这个问题。问题 1):在看到大家的建议后,我修改了我的脚本,改为

mysqldump --databases 360_projects --single-transaction --add-drop-database --triggers --routines -u$user -p$password > $1pmbackup${today}.sql 2>&1 >> /var/log/cron

或者类似的东西,我一意识到这是愚蠢的,就删除了它。当时发生的事情是,我正在创建一个文件,但大小为 0 字节。删除它解决了这个问题。然而,在解决了你们提到的所有问题后,我在 /var/log/cron 中遇到了这个错误:

Aug 28 10:27:50 www5 crontab[12101]: PAM pam_end: NULL pam handle passed

这让我发现这是 CentOS 中 cronie 的一个错误(我想我应该提到这个 askUbuntu 比其他 Linux QA 网站更频繁/更友好)。所以我更新了它,现在它运行良好。以下是我的最终脚本,供参考。

#!/bin/bash

# you must pass arguments to this script
if [ $# -eq 0 ]
        then
                echo "No arguments supplied"
                exit 1
fi

# if a path is supplied, perform the mysqldump to that directory
today=`date +%m-%d-%Y`
mysqldump --defaults-file=/home/achamberlain/.my.cnf --databases 360_projects --single-transaction --add-drop-database --triggers --routines -u BACKUPUSER > $1pmbackup${today}.sql

我的 crontab 如下所示:

# Backup of MySQL Database every 4th Hour, Locally, Remotely
5 8-20/4 * * * /home/<user>/Scripts/sql-backup.sh /media/vantecBackup1/mysqlBackup-Daily/

编辑:我的解决方案最初使用了您提供的所有 PATH 变量作为答案,但没有它也可以工作,所以它可能只是 cronie 中的错误。

相关内容