3

也许还有另一种解决方案。我构建了一个 Web 应用程序,需要 5-10 个 cron 来保持它的维护和不同的时间间隔。我想将 crontab 签入到版本控制中,以便可以轻松地将其部署到其他服务器。

我希望能够在 /etc/crontab 文件中添加一行,告诉它查看 /myapp/app.crontab 文件并将该文件中的所有行视为 crontab 条目......即:

0 1 * * *    root   /bin/sh /do/something.sh

为什么不直接签入 /etc/crontab?因为在从服务器部署到服务器时,某些服务器的 crontab 中可能有我不想干扰的不同条目。

有任何想法吗?其他人在 rev ctrl 中存储一堆 crontab 条目是做什么的?
谢谢。

4

4 回答 4

4

将您的 crontab 文件放入 /etc/cron.d/ - 作为签出文件或指向签出文件的符号链接。

于 2009-02-05T10:37:25.797 回答
1

在我正在进行的项目中,我们对这个问题采取了非常不同的方法。

我们有一个 Perl 脚本crontab.pl,所有服务器都在它们的 crontab 中调用它。这样做意味着 crontab 永远不必在连续的应用程序部署中更改,并且crontab.pl脚本可以愉快地与其他应用程序源文件一起存在于源代码控制中。

我们可以使用命令行参数为该脚本指定不同的时间间隔。crontab 如下所示:

*/5 * * * * /usr/local/apache/crontab.pl 5    > /var/log/crontab.log 2>&1 # 5 minute interval
1   * * * * /usr/local/apache/crontab.pl 60   > /var/log/crontab.log 2>&1 # 1 hour interval
1   1 * * * /usr/local/apache/crontab.pl 3600 > /var/log/crontab.log 2>&1 # 1 day interval

然后只需读取该命令行时间间隔并运行给定时间间隔所需的任务即可。

于 2009-02-26T03:49:33.230 回答
0

只需将一个(或很少)条目添加到 crontab,并让该条目成为调用其他条目的受修订控制的脚本:

0 * * * * /path/to/app/hourly.sh 0 0 * * * /path/to/app/daily.sh 0 1 * * 5 /path/to/app/weekly.sh

然后,hourly.sh 将调用所有需要按小时完成的操作,daily.sh 将调用所有需要每天完成的操作,依此类推。

我发现在为单个应用程序管理大量 cron 作业时,最好不要让所有作业都挂在 crontab 中,因为这会鼓励您忽略它们之间的依赖关系,即在过去 14 分钟运行的一项任务小时取决于一个在该小时后 12 分钟运行的任务,但每隔一段时间,该任务需要 2.1 分钟才能完成,而另一个脚本失败,给你一个 Heisenbug。

另一种方法是编写自己的守护进程来管理这些任务。

于 2009-02-10T19:09:40.967 回答
0

我这样做的方法是将我的 crontab 文件放在源代码控制中,然后在我的部署脚本中,将 crontab 文件替换为正在部署的文件。

你可以这样做:

crontab filename

或者对于特定用户(必须对此具有超级用户访问权限):

crontab -u my_web_user filename

一个重要的警告是,它假设每个用户只有一个 crontab 条目,并且它存储在 SCM 中。如果其他人在服务器上编辑 crontab,这些编辑将在下一次部署时丢失。所以请注意这一点。

于 2009-02-26T02:42:38.667 回答