我是 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)
所以我认为
- 这是关于 crontab 由于权限被拒绝而无法创建备份文件的问题。
- 这是关于我没有安装 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
如果运行该命令的用户crontab
是vagrant
,并且写入输出的目录属于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
无论如何您都将错误重定向到,将没有任何内容可发送。但我怀疑目前有错误消息要发送,这应该证实我上面的发现。