如何将输出从cron重定向到文件?


105

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

crontab -e

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

在上面的cron条目中,我都将两者都重定向stderr and stdout到日志文件。

上面的cron作业可以很好地执行,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运行脚本时,它会按要求运行,并且输出将写入日志文件

ranveer@ranveer:~$ ./backup.sh &>> backup.log 
ranveer@ranveer:~$ cat backup.log
Fri Oct 19 20:28:01 IST 2012
successfully copied testdir
test.txt successfully copied
-------------------------------------------------------------------------------------
ranveer@ranveer:~$ 

因此,为什么文件输出没有从cron中重定向到文件。


Answers:


158

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

M1

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

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

我相信上述工作,因为在默认情况下cron是用sh跑的,而不是任务bash,以便&>>不被支持sh

M2

通过添加更改默认的shell SHELL=/bin/bashcrontab -e的文件。


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

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

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

2
*/1 * * * * /home/ranveer/vimbackup.sh &>> /home/ranveer/vimbackup.log也做同样的事情。
亚尼克·吉鲁亚德

5

免责声明[1]。

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

确保您的Shell重定向语法符合/bin/sh。如果您尝试使用无效的shell重定向语法,则/bin/sh命令将失败,并且cron作业将永远不会运行。

/etc/cron.d/example1配置文件中,如果您指定的用户不是root且该用户的登录shell不是/bin/bash...,则您仍必须在/etc/cron.d/example1命令中使用/ bin / sh语法。


例如

如果您的用户具有shell cshzshksh为他的登录shell设置了。在您的/etc/cron.d/example1配置文件中,该命令必须使用/bin/sh语法。具体来说,任何外壳程序重定向都必须是/bin/sh语法。

如果您尝试在中使用例如cshshell重定向语法/etc/cron.d/example1,那么cron作业将永远不会运行。crond位于的日志文件/var/log/cron应说明该命令已运行,但是在您的命令运行之前,该命令将因语法错误而出错。

在哪里crond发出语法错误的错误消息?

该错误从未在中报告过/var/log/croncrond而是默认使用发出任何错误消息mail。因此,您必须检查/var/spool/mail/${USER}以查看错误所在。

[1]

免责声明

  • 这个答案假设一个sysv系统
  • systemd 信息可能有所不同
  • 特别是,此信息是为centos-6发行版而学习的,可能不适用于其他sysv发行版
    • centos-6特别提到,因为不同的发行版可能具有crondcentos-6

2
如果希望您的/etc/cron.d/example1命令使用其他外壳,则可以SHELL=/etc/cron.d/example1配置文件中使用set 。
Trevor Boyd Smith,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.