每小时,每天,每周使用crontab和/ etc / cron之间的区别


12

我有一个计划的脚本,该脚本每小时对我们的Subversion存储库进行svnsync备份。我从crontab根目录中的某个条目运行它没有问题,但是我决定从/etc/cron.hour来运行它,以获取更多的可见性(并且因为我们的一位工程师不小心删除了crontab,因为他认为“ crontab -r”的意思是“阅读crontab ;-))

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

因此在我看来,从cron.hourly运行时与通过根crontab运行时,脚本是在不同的用户环境下执行的。谁能解释其中的区别?

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

更新2:感谢到目前为止的建议;我认为这更多地是一个Subversion问题。我总是尝试将环境封装到脚本中,但是这里的问题是我不确定在从以下位置运行脚本时,SVN要求接受SSL证书的环境中(或缺少该环境)的原因每小时一次。我猜想这与运行部件脚本的执行方式有关。


1
包括您选择的发行版和cron软件包将很有用。
丹·卡利

Answers:


4

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

就是说,我几乎可以肯定,您最好从hooks / post-commit脚本中调用svnsync,如其他地方建议的那样。然后,您的镜像始终处于同步状态,而不是与一个小时前的主机同步。


16

在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 )

还请记住,您可能可以在/etc/cron.d/中放置一个crontab片段。

如您所见,此环境没有什么特别之处。至少在Debian / Ubuntu上,所有这些都作为root帐户运行。

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


6

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

使用/etc/cron.*(每小时,每天,每周,每月)脚本root是为用户配置crontab的一种更简便的方法(防止常见的语法错误),并且可以通过run-parts在目录中运行脚本或程序来处理。默认情况下(/etc/crontab),所有这些规则仍在系统范围内的crontab中定义,因此是同一回事。

当使用来处理cron作业时run-parts,调试起来更容易,因为您可以通过以下方式简单地测试哪些脚本将准确运行(尚未运行):

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

3

我的第一个疯狂猜测是检查您的HOME变量。

在我的Centos系统上,man 5 crontab说:

cron(8)守护程序会自动设置几个环境变量。SHELL设置为/ bin / sh,LOGNAME和HOME从crontab所有者的/ etc / passwd行设置。

因此,如果没有另外指定,则root的crontab将/ root用于HOME。但是在/ etc / crontab中(通过运行部件从中运行/etc/cron.hourly的位置)中,HOME设置为/(并且SHELL设置为/ bin / bash而不是/ bin / sh)。

我不知道svnsync,但是subversion确实使用〜/ .subversion /目录,因此这可能取决于HOME。


3

在我的RHEL 5.1系统上,从/ etc / crontab设置PATH环境变量。最上面的东西就是被馈送到环境中的东西。

如果重新启动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调用。


2

/var/log/messages (或您发行版的等效版本)应告诉您何时以及以哪个用户身份运行了什么命令的细节。


2

永远不要假设环境中有任何东西。总是防御性地编码。您有一个完整的文件,可以在其中放置所需的任何环境设置内容。用它。


2

除了可移植性以外,我上次检查(在Debian中)时建议不要将其放入cron.hourly(及其他)中,如果要使用您的内容创建软件包,则不要直接将其放入crontab中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.