mysqldump 命令在 cron 作业中不起作用

mysqldump 命令在 cron 作业中不起作用

我正在尝试使用 cron 中安排的以下 bash 脚本进行备份。

#!/bin/bash
echo "Hello"
while read table
do
/usr/bin/mysqldump -uroot -pxxxxxx CMAYA_RadiusUserLogs $table > sc_back/${table}.sql
done < tables.txt

cron 安排如下

58 16 * * * root /bin/sh -x /backup/call_backup.sh > /backup/backup.log

/var/log/cron 如下

Jul  3 16:27:01  (root) CMD (/bin/sh -x /backup/backup.sh > /backup/backup.log)

/备份/备份.log

[root@ backup]# cat backup.log
Hello

当我手动执行这个相同的脚本时,它可以正常工作,并将任何其他命令放入脚本中,它可以在 cron 作业中工作。

答案1

我已更正tables.txt 路径,但问题仍然存在,但在重定向 std err 2>&1 后,它开始工作。我发现警告消息“警告:在命令行界面上使用密码可能不安全”的原因。造成了问题。在此消息之后 mysqldump 退出,因此我重定向了错误并开始工作。我在将 mysql 升级到 5.6 后观察到了这一点。

#!/bin/bash

echo "Hello"
while read table
do
touch sc_back/${table}.sql
/usr/bin/mysqldump -uroot -pxxxxx CMAYA_RadiusUserLogs $table > /backup /sc_back/${table}.sql
done < /backup/tables.txt

答案2

问题是,在脚本的最后一行,您需要输入文件的完整绝对路径tables.txt,否则 cron 作业无法找到它。

当您手动启动脚本时,该脚本可以正常工作的原因是该tables.txt文件位于当前目录中,因此系统可以轻松找到它。

答案3

当 cron 执行脚本时,当前工作目录是 cron 表的用户主目录(显然是 /root),而脚本及其文件位于 /backup 下。这就是为什么脚本找不到 table.txt 并且表循环没有迭代的原因。

您应该首先 cd 到脚本的目录,然后执行它,例如:

58 16 * * * root cd /backup && /bin/sh -x call_backup.sh > backup.log

相关内容