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/bash在crontab -e文件中添加来更改默认 shell 。
免责声明 [1]。
我想在@RanRag 的回答中添加脚注或附录。
确保您的 shell 重定向语法符合/bin/sh. 如果您尝试使用无效的 shell 重定向语法,/bin/sh那么您的命令将失败并且您的 cron 作业将永远不会运行。
在您的/etc/cron.d/example1配置文件中,如果您指定的用户不是root该用户,并且该用户的登录 shell 不是/bin/bash...您仍然必须在/etc/cron.d/example1命令中使用 /bin/sh 语法。
如果您的用户有 shellcsh或zsh或ksh为他的登录 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