crontab 错误(未安装 MTA),但我使用 >/dev/null 2>&1

crontab 错误(未安装 MTA),但我使用 >/dev/null 2>&1

我是 Linux 用户的新用户

我尝试使用 vagrant 用户运行 crontab 来备份我的数据库

* * * * * /usr/bin/mysqldump -h localhost -u root -p root mydb | gzip > /var/backup/all/database_`date +%Y-%m-%d`.sql.gz >/dev/null 2>&1

当 crontab 运行时,文件夹中没有备份文件(我的 backup/all 具有权限方案755)。

这是错误来自/var/log/syslog

Aug 16 11:55:01 precise64 CRON[2213]: (vagrant) CMD (/usr/bin/mysqldump -h localhost -u root -p root mydb | gzip > /var/backup/all/database_`date +%Y-%m-%d`.sql.gz >/dev/null 2>&1)
Aug 16 11:55:01 precise64 CRON[2212]: (CRON) info (No MTA installed, discarding output)

所以我认为

  1. 这是关于 crontab 由于权限被拒绝而无法创建备份文件的问题。
  2. 这是关于我没有安装 MTA 但我使用>/dev/null 2>&1禁用 crontab 将其发送到电子邮件为什么会出错?

答案1

当然,错误是您没有实现并激活邮件程序(sendmail、postfix 等)。

话虽这么说,您的另一个问题是 >/dev/null 2>&1 仅适用/关联到本例中的 LAST 命令 gzip。因此,mysqldump 必须有某种类型的输出进入 STDERR。

做我认为你想做的事情的正确方法是:

 * * * * *  (command | command ) >/dev/null 2>&1

答案2

你可以输入:

MAILTO=""

在 crontab 文件的开头,这将阻止它尝试发送电子邮件。

答案3

如果运行该命令的用户crontabvagrant,并且写入输出的目录属于root,并且具有权限755,则无法写入该目录。
sudo chown vagrant /var/backup/all
可能会解决这个问题。

要检查这是否是问题所在,请尝试写入文件/tmp

但还有另一个问题:像这样的命令
mysqldump mydb | gzip > database.sql.gz >/dev/null 2>&1
将数据库转储写入database.sql.gz/dev/null
2>&1错误消息复制到标准输出,这意味着它还将错误消息写入database.sql.gz.它将错误消息文本写入压缩数据之间的某个位置,因此压缩文件将被破坏。请注意,它在测试时可能运行良好 - 因为只有在将某些内容写入标准错误流时才会出现问题。 stderr 的输出可能只是一个警告,而其他一切都有效。

我假设您打算将压缩数据库转储写入 sql.gz 文件,并将错误写入/dev/null.为此,只需保持输出流分离,不要将错误流复制到输出流。并将它们定向到这样的文件:

mysqldump mydb | gzip > /var/backup/all/database_`date +%Y-%m-%d`.sql.gz 2>/dev/null

错误消息“(未安装 MTA,丢弃输出)”是 cron 告诉您它无法向您发送错误输出。这最终不会有问题,因为/dev/null无论如何您都将错误重定向到,将没有任何内容可发送。但我怀疑目前有错误消息要发送,这应该证实我上面的发现。

相关内容