У меня есть команда, которая запускает моментальный снимок диска (на EC2, замораживает диск XFS и запускает команду моментального снимка EBS), которая настроена на регулярное выполнение в качестве задания cron. В идеале я хотел бы иметь возможность отложить выполнение команды на определенный период времени, если диск интенсивно используется в момент, когда запланировано выполнение задачи.
Боюсь, что использование nice / ionice может не дать должного эффекта, так как я хотел бы, чтобы скрипт выполнялся с высоким приоритетом во время его работы (т.е. дождитесь подходящего времени, а затем быстро закончите).
Спасибо.
ОБНОВИТЬ:
Это то, к чему я пришел. Он проверяет / proc / diskstats и запускает мою работу, когда текущая активность ввода-вывода достигает 0 или истекает время ожидания. Мне, вероятно, придется настроить это, когда я посмотрю, какие операции ввода-вывода наши серверы фактически получают в производстве:
#!/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
Вы можете взглянуть на пакетную команду. Возможно, она подойдет вам.
man batch
для более подробной информации (это часть подсистемы at)
я нашел здесь Perl скрипт http://www.skolnick.org/cgi-bin/list.pl?file=serverload.pl
Это должно сделать то, что вам нужно.
Вы, вероятно, могли бы реализовать это с помощью простого сценария оболочки, который анализирует время безотказной работы и выполняется только после того, как средняя загрузка снизится до определенного значения.
Помните, что если ваш сервер постоянно занят, ваши cronjobs никогда не будут выполняться!
Возможно, лучшая идея, если у вас есть память, - это запускать задания cron с самым низким приоритетом ОС, поэтому они будут потреблять только свободные ресурсы.
Как насчет написания небольшого скрипта опроса / демона, который, начиная с вашего запланированного времени, проверяет iostat (vmstat) на низкую активность диска и продолжает проверять каждые 5 минут, пока активность диска не станет ниже / ниже заданного порога или период времени не будет прошло, что будет раньше?