我有一个备份脚本,需要在一天中的特定时间运行,因此我正在使用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
运行任务而不是bash
so&>>
不支持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
。
例如
如果您的用户有 shellcsh
或zsh
或ksh
为其登录 shell 设置。在您的/etc/cron.d/example1
配置文件中,命令必须使用/bin/sh
语法。具体来说,任何 shell 重定向都必须是/bin/sh
语法。
如果您尝试csh
在您的 中使用 shell 重定向语法/etc/cron.d/example1
,那么您的 cron 作业将永远不会运行。crond
位于的日志文件/var/log/cron
应表明该命令已运行,但在命令运行之前该命令将因语法错误而出错。
在哪里crond
发出语法错误的错误消息?
该错误从未在 中报告过/var/log/cron
。crond
相反,默认情况下会使用 发出任何错误消息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/