我正在尝试使用 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