使用 crontab 和 /etc/cron.hourly,daily,weekly 之间的区别

使用 crontab 和 /etc/cron.hourly,daily,weekly 之间的区别

我有一个计划脚本,每小时执行一次 Subversion 存储库的 svnsync 备份。我从根 crontab 中的条目运行它,没有任何问题,但为了获得额外的可见性,我决定从 /etc/cron.hourly 运行它(并且因为我们的一位工程师意外删除了 crontab,因为他认为“crontab -r”的意思是“读取 crontab ;-))

cron.hourly 脚本中的 svnsync 命令全部失败,并显示一条消息,提示需要接受 SVN 存储库的 SSL 证书(这是用户第一次访问 SVN 存储库时以交互方式收到的消息,但是一旦我接受了证书,该消息就不会再出现)。

因此,在我看来,从 cron.hourly 运行脚本时,与通过 root crontab 运行脚本时,脚本在不同的用戶環境下執行。有人能解釋一下其中的差異嗎?

更新:我应该提到我的发行版,我在 CentOS 5.1 上使用 anacron。

更新 2:感谢您迄今为止提出的建议;我认为这更像是一个 Subversion 问题。我总是尝试将我的环境封装到我的脚本中,但这里的问题是,我不确定环境中的什么(或缺少什么)导致 SVN 在我从 cron.hourly 运行脚本时要求接受 SSL 证书。我猜这与 run-parts 脚本的执行方式有关。

答案1

您想使用“--config-dir”选项让它知道在哪里找到已接受的证书(例如默认情况下为~/.subversion)。

话虽如此,我几乎可以肯定你最好从 hooks/post-commit 脚本中调用 svnsync,因为在其他地方建议。那么你的镜像将始终保持同步,而不是与你的主服务器一小时前的位置同步。

答案2

在 Debian/Ubuntu 系统上,cron.daily|weekly|montly 从主 crontab 启动。

17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

还请记住,你可能可以将 crontab 片段放在 /etc/cron.d/ 中

如您所见,此环境没有什么特别之处。至少在 Debian/Ubuntu 上,它都是以 root 帐户运行的。

当我在脚本的最开始编写 cron 脚本时,我总是设置我的 PATH 和我将要使用的其他环境变量,因此我可以确定它在任何环境中都能正常工作。

答案3

常规系统范围的 crontab 是特定用户的 crontab,它具有用户名字段,如 所用/etc/crontab

使用脚本/etc/cron.*(每小时、每天、每周、每月)是为root用户配置 crontab 的一种更简洁、更简单的方法(可避免常见的语法错误),这由在目录中运行脚本或程序来处理run-parts。默认情况下,所有这些规则仍然在系统范围的 crontab 中定义(/etc/crontab),因此它们是相同的。

当 cron 作业由 处理时run-parts,更容易调试,因为您可以通过以下方式简单地测试哪些脚本将准确运行(无需运行它们):

sudo run-parts --report --test /etc/cron.daily

答案4

在我的 RHEL 5.1 系统上,PATH 环境变量是从 /etc/crontab 设置的。顶部的所有内容都是输入到环境中的内容。

如果您重新启动 cron,则第一次运行时(如果来自/etc/crontab/var/spool/cron/$USER)它会在 /var/log/cron 中记录它。否则它只会记录 cron.hourly 已运行

我的 crontab 设置如下:

01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

您可以将以下内容放入 /etc/cron.hourly:

env > /tmp/cron.env

然后在文件出现时检查它,并修改脚本(如果可以)以正确设置环境,或者编写 crontab 将调用的简短包装脚本。

相关内容