在脚本中创建日志文件在手动运行时有效,但通过 cron 运行时无效

在脚本中创建日志文件在手动运行时有效,但通过 cron 运行时无效

我使用 Percona 的 Xtrabackup 工具每晚备份数据库。我编写了一个包装器脚本来保留适当数量的备份,将输出写入日志文件,并在备份终止时通过电子邮件发送日志文件。当我以 root 身份手动运行脚本时,日志文件会按预期生成。但是,一旦我将其放入 cron,就会创建日志文件,但不生成任何内容。以下是脚本的相关部分(如果我应该发布整个脚本,请告诉我。

DATE=`date +%F-%H%M`
LOC=/var/mysqlbackups/dbBackup-$DATE
LOGLOC="$LOC.log"
/usr/bin/innobackupex --user=$SQLUSER --password=$SQLPASSWORD --no-timestamp $LOC &>>$LOGLOC
if [ $? -ne 0 ]
then
  CONTENT="Backup Failed. Log information below.\n\n--------------------------------------------------------\n$CONTENT"
  CONTENT+=`cat $LOGLOC`
  echo -e "$CONTENT" | mail -s "Backup on DB3 failed" [email protected]
  exit 1
fi

这里是 root 的 crontab 中的 crontab 条目:

5 1 * * * /usr/local/sbin/dbBackup.sh

以及生成的目录/文件。并不是我在 1 月 28 日手动运行它,而是在 1 月 29 日由 cron 运行它:

drwxr-xr-x 5 root root  4096 Jan 28 10:18 dbBackup-2015-01-28-1010
-rw-r--r-- 1 root root 21441 Jan 28 10:18 dbBackup-2015-01-28-1010.log
drwxr-xr-x 5 root root  4096 Jan 29 01:14 dbBackup-2015-01-29-0105
-rw-r--r-- 1 root root     0 Jan 29 01:05 dbBackup-2015-01-29-0105.log

我问过 Google,但没能找出问题所在。如能得到任何帮助,我将不胜感激。

答案1

我看到两种可能性。第一,我强烈建议在 cron 作业中使用完整路径来执行所有命令 - 例如,/usr/bin/cat而不是cat。第二,在 cron 环境中,您的 shell 可能更具限制性,字符串+=语法不起作用。尝试以某种方式找到解决方法 - 我不知道该怎么做,但cat我应该从另一个文件开始。

答案2

事实证明,使用只有 bash 支持的 IO 重定向在 cron 中运行时会破坏脚本。我改用老式的 2>&1 语法,问题就解决了。

相关内容