我有一个备份脚本,需要在一天的特定时间运行,因此我正在使用cron来完成此任务,并且在cron中,我还尝试将备份脚本的输出重定向到logfile

crontab -e

*/1 * * * * /home/ranveer/backup.sh &>> /home/ranveer/backup.log


在上面的cron条目中,我将两个stderr and stdout都重定向到日志文件。 syslog并执行backup.sh文件中提到的任务,但不向日志文件写入任何内容。

/var/log/syslog

Oct 19 20:26:01 ranveer CRON[15214]: (ranveer) CMD (/home/ranveer/backup.sh &>> /home/ranveer/backup.log)


何时我从cli运行脚本,该脚本按要求运行,并且输出被写入日志文件。

在cron中。

评论

superuser.com/questions/122246/…

#1 楼

我解决了问题。有两种方法:

M1

将重定向从&>>更改为2>&1。所以现在crontab -e看起来像

*/1 * * * * /home/ranveer/vimbackup.sh >> /home/ranveer/vimbackup.log 2>&1


我相信上面的方法是有效的,因为默认情况下cron使用sh而不是bash来运行任务,所以&>>不支持sh。 br />
M2

通过在SHELL=/bin/bash文件中添加crontab -e来更改默认外壳。

评论


cron就像sh:它不会选择一个程序。有很多实现。最流行的实现是Vixie cron。我是另一本书的作者(当前,不是原始作者)。我相信大多数cron守护程序都将使用系统的sh,但是在是否接受&>>方面可能有所不同。一些cron守护程序(例如我的cron守护程序)使您无法更改crontab中使用SHELL = ...很高兴您找到了适合您的解决方案;只是认为值得指出的是,有很多变量可能会影响它是否对其他人有用。

– dubiousjim
2012年10月19日15:50

如何在输出文件名中插入YYYY-MM-DD_hh-mm-sec,以使每个文件名都不同并且无需重写就可以保留?

–丹尼尔(Danijel)
16年1月11日在13:18

@Danijel:这应该有助于serverfault.com/questions/117360/…

–RanRag
16年1月15日在9:09

* / 1 * * * * /home/ranveer/vimbackup.sh&>> /home/ranveer/vimbackup.log也做同样的事情。

– Yanick Girouard
17年8月15日14:56

#2 楼

免责声明[1]。

我想在@RanRag的答案中添加脚注或附录。

确保您的Shell重定向语法符合/bin/sh。如果您尝试使用对/bin/sh无效的shell重定向语法,则命令将失败,并且cron作业将永远不会运行。该用户的登录外壳不是/etc/cron.d/example1 ...,您仍必须在root命令中使用/ bin / sh语法。


例如

如果用户具有外壳为他的登录shell设置了/bin/bash/etc/cron.d/example1csh。在您的zsh配置文件中,该命令必须使用ksh语法。具体来说,任何外壳程序重定向都必须使用/etc/cron.d/example1语法。位于/bin/sh/bin/sh日志文件应说明该命令已运行,但该命令将在运行命令之前因语法错误而出错。 br />
csh中从未报告过该错误。 /etc/cron.d/example1会默认使用crond发出任何错误消息。因此,您必须检查/var/log/cron才能查看错误是什么。

crond信息可能有所不同
具体来说,此信息是针对/var/log/cron发行版而获得的,可能不适用于其他crond发行版


我特别提到mail不同的发行版可能具有与/var/spool/mail/${USER}不同的sysv实现方式





评论


如果您希望/etc/cron.d/example1命令使用其他Shell,则可以在/etc/cron.d/example1配置文件中使用set SHELL =。

–特雷弗·博伊德·史密斯(Trevor Boyd Smith)
17年5月29日在20:08

#3 楼

您可以将输出信息定向到带有大号的日志文件,例如以下示例: //crontab-generator.org/