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

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

我有一个备份脚本,需要在一天中的特定时间运行,因此我正在使用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 中重定向到文件。

答案1

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

M1

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

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

我相信上面的方法是有效的,因为默认情况下cron使用的是sh运行任务而不是bashso&>>不支持sh

M2

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

答案2

免责声明[1]。

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

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

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


例如

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

如果您尝试csh在您的 中使用 shell 重定向语法/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特别提到,因为不同的发行版可能有不同的crond实现centos-6

答案3

您可以使用 2 个大于号将输出信息定向到日志文件,如下例所示:

* * * * * /usr/bin/python /path/to/script.py >> /path/to/logfile/output.log

请在此链接中查看这个方便的 crontab 行生成器:https://crontab-generator.org/

相关内容