我有一个脚本,让我们称之为run-jobs.sh,我想运行它。它需要1个参数。我目前设置的是一个cron
1 7 * * * /home/admin/run-jobs.sh arg1
2 7 * * * /home/admin/run-jobs.sh arg2
3 7 * * * /home/admin/run-jobs.sh arg3
我有很多不同的论点(比方说100)可以运行,但我想在一整天内传播它,所以它不能一次性运行所有内容。使用cron执行此操作的最佳方法是什么,无需创建巨大的cron列表并且每次都必须编辑它?除了cron之外还有什么可以帮助我解决这个问题吗?
答案 0 :(得分:3)
最简单的事情可能就是拥有一个每天运行一次并在调用之间休眠的包装脚本,例如。
的crontab:
0 0 * * * /home/admin/run-all-jobs.sh arg1 arg2 arg3
run-all-jobs.sh:
for arg in "$@"; do
# run the job as a background task,
# so the job's duration doesn't throw off the timing
run-jobs.sh "$arg" &
# split the args evenly around 24 hours
sleep $(( 24 * 60 * 60 / $# ))
done
这很简单,对于简单的情况也可以正常工作,但它不是很强大。 Cron会为你处理很多边缘情况。
另一种选择是动态生成crontab,因此您不必手动编辑它。此示例以15分钟为间隔安排每个作业,因此一旦您有超过96个作业,它将开始重叠作业,但您可以调整它以按不同的时间间隔安排作业。
generate-jobs.sh:
for (( i=1; i<=$#; i++ )); do
printf "%d %d * * * /home/admin/run-jobs.sh '%s'\n" \
"$(( i / 4 ))" "$(( i % 4 ))" "${!i}"
done > /etc/cron.d/run-jobs.cron
这会将文件写入/etc/cron.d
,cron
将从常规crontab中读取文件。
第三个选项是使用at
,它可能更多地涉及但可能是你真正想要的。 at
是一个很棒的工具,可让您安排任务&#34; at&#34;未来的某些方面。使用at
,您可以完全避免使用cron,只需安排自己的工作。
答案 1 :(得分:1)
你可以写一个包装脚本, 安排它每小时运行一次, 这将使用适当的参数运行主脚本,具体取决于小时。
* 7 * * * /home/admin/run-jobs-wrapper.sh
包装器可能类似于:
case "$(date +%H)" in
01) /home/admin/run-jobs.sh arg1 ;;
02) /home/admin/run-jobs.sh arg2 ;;
...
esac
(注意date +%H
输出小时0填充。)
这样你会有一些容易理解的东西,
在单个脚本中易于控制,可以置于版本控制之下,
没有创建大crontab
。
它也很容易管理,
例如,在机器重新启动的情况下,
很容易知道究竟会运行什么,
因为它只取决于当前时间。
答案 2 :(得分:1)
另一种方式(dimo414 answer的变体,使用at
的最后一个选项)将运行单个批处理命令。因此,您将拥有一个单 crontab
条目,该条目将使用batch(1)(at
的变体)来运行所有数百项内容。或者甚至在每个命令的循环中调用batch
。
请注意,batch
子系统限制了计算机上的负载(并且可以配置为具有单个批处理作业队列)。但是,它不会在排队的批处理作业之间休眠。