На моем сервере есть несколько отдельных экземпляров Apache Tomcat, запуск каждого из которых требует много времени и ресурсов процессора. Невозможно запустить все сразу. Это приведет к слишком большому количеству операций ввода-вывода, запуск каждой службы займет гораздо больше времени, а службы могут даже не запуститься из-за внутренних тайм-аутов.
Вот какой-то псевдокод, описывающий то, что я хочу делать. Как мне сделать это с помощью файла monitrc?
check process service01 with pidfile /var/run/service01.pid
start program = "/usr/sbin/service service01 start" with timeout 60 seconds
stop program = "/usr/sbin/service service01 stop"
if does not exist then
wait a random number of seconds (between 2 and 5 minutes)
if the cpu load is < 100% then
start program
else
do nothing (check again in the next cycle)
check process service02 with pidfile /var/run/service02.pid
....
Этот блок кода будет повторяться для каждой из 10 услуг.
Критический шаг - случайное ожидание. В противном случае, если сервер простаивает и никакая служба не запущена (например, после 'killall -9 java'), monit проверит все службы, обнаружит, что загрузка процессора сейчас низкая, и запустит все службы сразу.
Теперь я нашел установку, которая выполняет эту работу. После перезапуска или сбоя нескольких процессов проверяется загрузка ЦП, и каждая служба запускается только после того, как загрузка ЦП станет ниже 1 или после долгой задержки. Приведенные ниже скрипты отлично работают в моей среде:
Отредактируйте / etc / monit / monitrc:
...
## Start Monit in the background (run as a daemon):
#
set daemon 120 # check services at 2-minute intervals
with start delay 240 # optional: delay the first check by 4-minutes (by
# # default Monit check immediately after Monit start)
Для каждой службы добавьте это в /etc/monit/conf.d:
check process myname with pidfile /var/run/app0000.pid
start program = "/usr/sbin/service app0000 start" with timeout 60 seconds
stop program = "/usr/sbin/service app0000 stop"
if does not exist then exec "/root/bin/service_with_delay app0000 start"
Создайте скрипт / root / bin / service_with_delay:
#!/bin/bash
(
# Wait for lock on /var/lock/service_with_delay.lock (fd 9)
flock -n 9 || exit 1
for i in `seq 1 10`; do
# start the service if the cpu load is < 1.0 or after waiting for 300 seconds
read load ignore </proc/loadavg
flag=`expr ${load} '<' 1`
if [ ${flag} -eq 1 ] || [ ${i} -eq 10 ]; then
echo `date` service_with_delay $1: pid $$ load ${load} i ${i} - starting >> /var/log/service_with_delay.log
/usr/sbin/service $1 start
# make sure next script getting the lock sees some load
sleep 60
break
fi
# wait
echo `date` service_with_delay $1: pid $$ load ${load} i ${i} >> /var/log/service_with_delay.log
sleep 30
done
) 9> /var/lock/service_with_delay.lock
Вы мало что рассказали о своей ОС, я могу только предположить, что это Linux (из kill -9 ...
часть). Я также мало знаю о контролировать, но предположим, что это гибкое решение, позволяющее повторить попытку запуска службы в случае сбоя.
Я предполагаю, что экземпляры Tomcat запускаются с помощью сценария запуска оболочки. Добавьте где-нибудь в начале этих скриптов:
# edit the 3 lines to set your limits
LOAD_THRESHOLD=0.75
LOCK_TIME=30
TIME_LIMIT=120
LOCK_FILE='/var/lock/tomcat-delay.lock'
if [ -z "${TOMCAT_NOLOCK}" ]; then
# simple locking mechanism to avoid simultaneous start of instances
if [ -f "${LOCK_FILE}" ] && [ $(cat "${LOCK_FILE}") -gt $(date '+%s') ]; then
exit 1
else
expr $(date '+%s') + ${LOCK_TIME} 1>"${LOCK_FILE}"
fi
fi
T_TIME=0
while true; do
# check for non-empty TOMCAT_NOWAIT
if [ -n "${TOMCAT_NOWAIT}" ]; then
break 1
fi
read T_LOAD60 T_REST </proc/loadavg
# check current 60 sec. average value for system load
if expr ${T_LOAD60} '<' ${LOAD_THRESHOLD} 1>/dev/null; then
break 1
fi
# check for timeout
if [ ${T_TIME} -ge ${TIME_LIMIT} ]; then
# change to 'exit 1' to fail on timeout instead of proceeding
break 1
fi
sleep 1s
echo -n '.'
T_TIME=$((${T_TIME} + 1))
done
Приведенный выше код на самом деле проверяет не только загрузку процессора, а среднюю загрузку системы, которая по замыслу включает все факторы, которые могут замедлить вашу производительность. ЛИМИТ ВРЕМЕНИ находится в секундах. Скрипт, наконец, попытается запустить вашу службу, если нагрузка не упадет ниже заданного порога за заданное время - последний break 1
часть может быть изменена на выход 1 прервать запуск и сообщить контролировать демон, чтобы повторить попытку.
Если вы попытаетесь запустить службу вручную (не из контролировать), он также будет ждать, что я считаю преимуществом. Вы можете экспортировать env TOMCAT_NOWAIT с непустым значением, чтобы этого избежать.
Редактировать # 1: добавлен простой механизм блокировки в качестве решения проблемы одновременного запуска экземпляров. Непустой env TOMCAT_NOLOCK отключает блокировку. Устанавливать LOCK_TIME ко времени разогрева экземпляров, поэтому высокая нагрузка определяется правильно.