依赖最少的方法是简单地使用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
这类似于将这些脚本中的每一个符号链接到/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"