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

Ran*_*Rag 150 bash cron io-redirection

我有一个备份脚本,我需要在一天的特定时间运行它,所以我正在使用cron这个任务,并且从 cron 中我也试图将备份脚本的输出重定向到logfile.

crontab -e

*/1 * * * * /home/ranveer/backup.sh &>> /home/ranveer/backup.log
Run Code Online (Sandbox Code Playgroud)

在上面的 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)
Run Code Online (Sandbox Code Playgroud)

当我从 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:~$ 
Run Code Online (Sandbox Code Playgroud)

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

Ran*_*Rag 220

我解决了这个问题。有两种方式:

M1

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

*/1 * * * * /home/ranveer/vimbackup.sh >> /home/ranveer/vimbackup.log 2>&1
Run Code Online (Sandbox Code Playgroud)

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

M2

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

  • `cron` 就像 `sh`:它不挑选单个程序。有很多实现。最流行的实现是 Vixie cron。我是另一个的(当前的,不是原始的)作者。我相信大多数 cron 守护进程会使用系统的 `sh`,但它是否接受 `&>>` 可能会有所不同。一些 cron 守护进程(比如我的)不允许你在 crontab 中使用 `SHELL=...` 行更改哪个 shell 执行 cron 行。我很高兴您找到了适合您的解决方案;只是认为值得指出的是,有许多变量可能会影响它是否适用于其他人。 (20认同)
  • @Danijel:这应该有帮助http://serverfault.com/questions/117360/sending-cron-output-to-a-file-with-a-timestamp-in-its-name (2认同)
  • `*/1 * * * * /home/ranveer/vimbackup.sh &>> /home/ranveer/vimbackup.log` 也做同样的事情。 (2认同)

Tre*_*ith 9

免责声明 [1]。

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

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

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


例如

如果您的用户有 shellcshzshksh为他的登录 shell 设置。在您的/etc/cron.d/example1配置文件中,该命令必须使用/bin/sh语法。特别是任何 shell 重定向都必须是/bin/sh语法。

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

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

该错误从未在/var/log/cron. crond相反,默认情况下使用mail. 因此,您必须检查/var/spool/mail/${USER}以查看错误是什么。

[1]

免责声明

  • 这个答案假设一个sysv系统
  • systemd 信息可能不同
  • 具体来说,此信息是为centos-6发行版学习的,可能不适用于不同的sysv发行版
    • centos-6特别提到,因为不同的发行版可能有不同的crond实现centos-6

  • 如果你希望你的 `/etc/cron.d/example1` 命令使用不同的 shell,你可以在你的 `/etc/cron.d/example1` 配置文件中使用设置 `SHELL=`。 (2认同)