Cronjob 覆盖脚本输出重定向

Cronjob 覆盖脚本输出重定向

我在运行我的脚本的 cronjob 中遇到了一个小问题。

该脚本看起来像这样,它的名称是create_report.sh

#!/bin/bash
cd /work/directory
/some/command.sh > reports/report_$(date -d "1 day ago" +%Y%m%d).txt

这显然有点简化,但是在将输出写入某个文件后,该文件会附加到电子邮件并发送给我。

当我“手动”运行它时,它工作正常并且报告文件有内容。

然后我使用 crontab-generator.org 创建了一个 cronjob,它每天早上 7 点运行该脚本并静音该脚本的输出。

0 7 * * * /path/to/script/create_report.sh >/dev/null 2>&1

当 cronjob 运行脚本时,报告文件被创建并发送给我,但它们是空的。我自己可能可以找到解决这种行为的方法,但我没想到会发生这种情况,有人可以向我解释这是如何发生的,并可能指出发生这种情况的正确方法吗?

澄清一下:我对它的输出不感兴趣,create_report.sh但对它创建的报告文件感兴趣。

提前致谢!

答案1

当 cron 执行您的 cron 作业时,它(最终)将执行 bash 来运行您的脚本,但该 bash 实例将是非交互式的,并且不是登录 shell,因此它不会获取您的任何配置文件。1如果您/some/command.sh依赖任何这些配置文件(设置变量或执行活动),那么您需要:

  • 显式获取这些文件, 或者
  • 在执行脚本之前设置 BASH_ENV (到正确的文件),或者
  • 在 she-bang 行中设置-i选项(加载~/.bashrc),或者
  • 在 she-bang 行中设置-i--login选项(加载 、 、 或 中的第一个~/.bash_profile~/.bash_login~/.profile或者
  • 设置这些变量或执行这些活动/some/command.sh

参考:

脚注:

  1. 除非你已经设置了 BASH_ENV

答案2

我看到两个问题:

1. /some/command.sh > reports/report_$(...).txt 提供目录的绝对路径,reports例如: /some/command.sh > /home/user/reports/report_$(...).txt

由于它确实可以手动执行,因此我假设该脚本在由 cron 守护程序执行时在不同的 CWD 中运行。

2. 您是否在同一用户下运行此 cronjob?

如果没有,请检查运行此 cronjob 的实际用户是否具有所有必需的权限(例如写入目录reports)。

如果没有任何效果,您可以通过观察系统日志(例如tail -f /var/log/syslog | grep CRON)并写入任何输出(stdoutstderr)到磁盘: 5 * * * * /path/to/script/create_report.sh >>/tmp/cronlog 2>&1

相关内容