到目前为止,我们手工管理服务器的crontabs。
我见过这个:
http://django-extensions.readthedocs.org/en/latest/jobs_scheduling.html
这是一个不错的django应用程序,因为你只需要编辑一次crontab。
您输入一次这样的行,并且将来软件更新就足够了,无需手动修改crontab来添加新作业。
@hourly /path/to/my/project/manage.py runjobs hourly
我不喜欢这个:它需要django。
有人看到过没有这种“大”依赖关系的解决方案吗?
例如,使用EntryPoints查找每小时/每周/每月要完成的所有包的解决方案?
更新
所有cron作业都是按照linux用户安装的,而不是root用户。
答案 0 :(得分:1)
依赖性最小的方法是简单地使用crontab
和run-parts
。
首先,设置用户crontab以为每个计划运行脚本(例如crontab -e
):
@hourly /path/to/run-hourly
@daily /path/to/run-daily
@weekly /path/to/run-weekly
@monthly /path/to/run-monthly
这类似于将每个脚本sym链接到Debian上的相应/etc/cron.{hourly,daily,weekly,monthly}
,但允许拥有用户运行它们而不是root。
其次,定义每个脚本以运行其作业。对于最简单的情况,每个脚本都可以使用run-parts
来运行其指定目录中的所有可执行作业脚本。
#!/bin/bash
#/path/to/run-hourly
run-parts /path/to/hourly/jobs
#!/bin/bash
#/path/to/run-daily
run-parts /path/to/daily/jobs
#!/bin/bash
#/path/to/run-weekly
run-parts /path/to/weekly/jobs
#!/bin/bash
#/path/to/run-monthly
run-parts /path/to/monthly/jobs
每个脚本还必须设置执行权限:
chmod +x /path/to/run-{hourly,daily,weekly,monthly}
第三,将任何所需的作业sym链接到相应的作业目录。如,
chmod +x /path/to/job
ln -s /path/to/job /path/to/daily/jobs/
或者,可以定义每个计划脚本以在每个项目的公共目录中搜索作业。假设每个项目都位于/path/to/projects
下,并且每个项目都有后代jobs/{hourly,daily,weekly,monthly}
,那么/path/to/run-hourly
可以定义为:
#!/bin/bash
#/path/to/run-hourly
JOBS=$(find /path/to/projects -type f -path '*/jobs/hourly/*')
while read -r JOB; do
"$JOB"
done <<< "$JOBS"
答案 1 :(得分:0)
这取决于您的发行版如何配置cron,但您可能会有一个/etc/cron.d/
目录。这是一个run-parts
样式的目录,用于保存cron配置定义。
软件包可以在安装过程中删除文件,以启用特定于软件包的cron作业。
例如,在我的Ubuntu机器上:
[jk@pecola ~]$ ls /etc/cron.d/
anacron php5
[jk@pecola ~]$ cat /etc/cron.d/php5
# /etc/cron.d/php5: crontab fragment for php5
# This purges session files older than X, where X is defined in seconds
# as the largest value of session.gc_maxlifetime from all your php.ini
# files, or 24 minutes if not defined. See /usr/lib/php5/maxlifetime
# Look for and purge old sessions every 30 minutes
09,39 * * * * root [ -x /usr/lib/php5/maxlifetime ] && [ -x /usr/lib/php5/sessionclean ] && [ -d /var/lib/php5 ] && /usr/lib/php5/sessionclean /var/lib/php5 $(/usr/lib/php5/maxlifetime)
单个文件只是标准的crontab(5)格式。