5

到目前为止,我们手动管理服务器的 crontab。

我见过这个:

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 安装的。

4

2 回答 2

1

依赖最少的方法是简单地使用crontabrun-parts

首先,设置您的用户 crontab 为每个计划运行一个脚本(例如,crontab -e):

@hourly /path/to/run-hourly
@daily /path/to/run-daily
@weekly /path/to/run-weekly
@monthly /path/to/run-monthly

这类似于将这些脚本中的每一个符号链接到/etc/cron.{hourly,daily,weekly,monthly}Debian 上的相应脚本,但好处是允许拥有用户而不是 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}

第三,将任何所需的作业符号链接到相应的作业目录。例如,

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"
于 2014-08-27T02:29:23.220 回答
0

这将取决于您的发行版如何配置 cron,但您可能会有一个/etc/cron.d/目录。这是一个run-parts保存 cron 配置定义的 -style 目录。

包可以在安装过程中将文件放在那里以启用特定于包的 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) 格式。

于 2014-08-27T02:44:11.123 回答