如何在服务器负载较低时运行作业?

我有一个运行磁盘快照的命令(在EC2上,冻结一个XFS磁盘并运行一个EBS快照命令),它被设置为定期运行一个cron作业。 理想情况下,如果磁盘在计划运行的那一刻被大量使用,我希望能够使命令延迟一段时间。

恐怕使用nice / ionice可能没有适当的效果,因为我希望脚本在运行时(即等待好时间,然后快速完成)以高优先级运行。

谢谢。

更新

这是我最终去的。 它会检查/ proc / diskstats并在当前IO活动达到0时运行我的作业,或者我们超时。 当我看看我们的服务器在生产中实际获得什么样的IO活动时,我可能不得不调整这个:

#!/bin/bash DEVICE=sdf # we want to make a snapshot when IO in progresses reaches this: LOW_THRESHOLD=0 TIMER=0 MAX_SEC_DELAY=120 # Get the number of IO operations in progress: ioInProgress(){ grep $DEVICE /proc/diskstats | awk '{print $12}' } # Wait for a good time to run snapshot, else timeout: while [[ $TIMER -lt $MAX_SEC_DELAY && $(ioInProgress) -gt $LOW_THRESHOLD ]]; do TIMER=`expr $TIMER + 1` sleep 0.5 done # Recording delay required: echo $TIMER echo "Executing snapshot" run-the-snapshot 

我在这里find了一个Perl脚本http://www.skolnick.org/cgi-bin/list.pl?file=serverload.pl

这应该做你需要的。

你也许可以用一个简单的shell脚本来实现这个function,这个脚本parsing了正常运行时间,只有在load average已经降低到某个值时才执行。

要小心,如果你的服务器不断繁忙,一个逃跑的过程,那么你的cronjobs永远不会执行!

如果你有内存,也许更好的办法是以最低的操作系统优先级运行你的cron作业,因此它们只会占用多余的资源。

你可以看看批处理命令也许它会适合你的需求。

man batch进一步的细节(这是在子系统的一部分)

如何编写一个小的轮询/守护进程脚本,从预定的时间开始,检查iostat(vmstat)是否存在低磁盘活动,并继续每5分钟检查一次,直到磁盘活动低于/低于预设的阈值或一段时间过去了,无论先到先得?