使用crontab和/etc/cron.hourly,每日,每周之间的区别

我有一个计划的脚本,每小时svnsync备份我们的Subversion版本库。 我从root crontab中的一个条目运行没有问题,但决定我想从/etc/cron.hourly运行它,而不是额外的可见性(因为我们的工程师之一意外删除了crontab,因为他认为“crontab -r“意思是”读取crontab ;-))

cron.hourly脚本中的svnsync命令都会失败,并显示SVN存储库的SSL证书需要被接受(这是您首次访问SVN存储库时交互式获得的消息,但一旦证书I接受的消息不会再来)。

所以在我看来,脚本是从cron.hourly运行时在不同的用户环境下执行,而不是通过根crontab运行。 任何人都可以解释这个区别

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

更新2:感谢您的build议, 我认为这正在变成一个颠覆性的问题。 我总是试图把我的环境封装到我的脚本中,但是这里的问题是,我不确定当我运行我的脚本时,SVN要求接受SSL证书的环境是什么(或缺less) cron.hourly。 我猜这是与运行部分脚本执行的方式有关。

你想使用'–config-dir'选项让它知道在哪里可以find被接受的证书(例如默认为〜/ .subversion)。

也就是说,我几乎可以肯定你会更好地从hooks / post-commit脚本中调用svnsync来代替,正如其他地方所build议的那样 。 那么你的镜子总是同步的,而不是与你的主人一个小时前的同步。

在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片段

正如你所看到的,这个环境没有特别的特殊之处。 至less在Debian / Ubuntu上,它全部以root帐户运行。

当我在脚本开始的时候编写cron脚本时,我总是设置我将要使用的PATH和其他环境variables,所以我可以确定它可以在任何环境下正常工作。

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

在/ /etc/cron.* (每小时,每天,每周,每月)中使用脚本是为root用户configurationcrontab的更简单,更简单的方法(防止常见的语法错误),这是由运行脚本或程序的run-parts一个目录。 所有这些规则仍然在系统范围的crontab中默认定义( /etc/crontab ),所以它是一样的。

当cron作业由run-parts处理时,更容易debugging,因为您可以简单地testing哪些脚本将被正确运行(而不运行它们):

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

我的第一个猜测是检查你的HOMEvariables。

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

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

所以,如果你没有另外指定,root的crontab会使用/ root作为HOME。 但是在/ etc / crontab(通过run-parts运行/etc/cron.hourly的地方),HOME被设置为/(SHELL为/ bin / bash而不是/ bin / sh)。

我不知道关于svnsync,但是颠覆确实使用〜/ .subversion /目录,所以可以依赖于HOME。

在我的RHEL 5.1系统上,PATH环境variables是从/ 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调用。

/var/log/messages (或者你的发行版的等价物)应该告诉你什么时候和作为哪个用户运行的命令的细节。

永远不要假定环境中有任何东西。 始终编​​码defensivly。 你有一个完整的文件,把任何环境设置你想要的东西在那里。 用它。

其他可移植性不多,最后一次检查(在Debian中),build议将东西放在cron.hourly(和其他)中,而不是直接放到crontab中,如果你想用你的东西创build一个包。