人们如何将cronjobs部署/版本控制到生产环境中?我更关心人们使用的惯例/标准,而不是任何特定的解决方案,但我碰巧正在使用git进行修订控制,并且cronjob正在运行一个python/django脚本。
def add_cronjob():
run('crontab -l > /tmp/crondump')
run('echo "@daily /path/to/dostuff.sh 2> /dev/null" >> /tmp/crondump')
run('crontab /tmp/crondump')
将crontab保存到临时文件中。
向tmpfile追加一行。
将crontab写回。
使用Fabric,我更喜欢在本地保持一个原始版本的crontab,这样我就知道生产环境上的确切内容,并且可以轻松地编辑条目以及添加它们。
我使用的Fabric脚本看起来像这样(某些代码已被删除,例如备份处理):
def deploy_crontab():
put('crontab', '/tmp/crontab')
sudo('crontab < /tmp/crontab')
http://django-fab-deploy.readthedocs.org/en/0.7.5/_modules/fab_deploy/crontab.html#crontab_update
django-fab-deploy模块有许多方便的脚本,包括crontab_set和crontab_update。
@task
def crontab():
run('crontab deployment/crontab.txt')
deployment/crontab.txt
文件的内容到您连接到服务器的用户的定时任务列表中。如果您在服务器上没有完整的项目,您需要首先put
定时任务文件。如果您无法将系统连接到配置管理系统(如cfengine/puppet),则手动部署crontab实际上有3个选项。
您可以简单地使用crontab -u user -e,但是您可能会冒着某人复制/粘贴时出现错误的风险。
您还可以将文件复制到cron目录中,但是该文件没有语法检查,在Linux中,您必须运行touch /var/spool/cron才能使crond捕获更改。
注意:每个人都会在某个时候忘记touch命令。
根据我的经验,这种方法是我最喜欢的手动部署crontab的方式。
diff /var/spool/cron/<user> /var/tmp/<user>.new
crontab -u <user> /var/tmp/<user>.new
你可以使用像CFEngine/Chef这样的工具进行部署(它可以部署所有东西,包括cron作业)。
然而,如果你问这个问题,可能是因为你有许多生产服务器,每个服务器都运行大量的计划任务。 如果是这种情况,你可能需要一个工具,不仅可以部署作业,还可以跟踪成功或失败,允许你轻松查看上次运行的日志、运行统计数据,允许你轻松更改许多作业和服务器的计划表(由于计划维护等原因)等等。
我使用了一个商业工具叫做“UC4”。我并不是真正推荐它,所以我希望你能找到一个更好的程序来解决同样的问题。我只是想说,作业管理并不仅仅在部署它们时结束。
你说:
我更好奇人们使用的惯例/标准,而不是任何特定的解决方案
但是,公平地说,特定的解决方案将取决于您的环境,并且没有通用的优雅银弹。鉴于您正在使用Python/Django,我建议使用Celery。它是Python的异步任务队列,与Django很好地集成。除了作为异步任务队列提供的功能之外,它还具有特定的定期任务功能。
我个人使用了django-celery-beat
集成,它与Django设置完美集成,并在分布式环境中正确运行。如果您的定期任务与Django相关,请强烈建议查看Celery。我最初只用于某些异步邮件,最终用于许多异步任务+定期的健全性检查和其他Web应用程序维护工作。