Мое приложение находится за балансировщиком нагрузки, и время от времени мне нравится проверять состояние на каждой машине, чтобы получить представление о времени, которое требуется для возврата документа index.html на каждой машине.
Скрипт выглядит так:
for host in 192.168.0.7 192.168.0.8 192.168.0.9; do
result=$( ( time wget -q --header="Host: domain.tomonitor.com" http://$host/ ) 2>&1 | grep real | awk '{print $2}' )
date=$(date)
echo "$date, $host, $result"
done
Поскольку приложение считает, что оно включено domain.tomonitor.com
, Я установил это вручную в заголовке запроса wget. Это grep
s для "реального" времени и awk
только время, сбрасывая его в переменную $ result. Эмпирически кажется, что это довольно хорошо работает в качестве базовой ручной проверки - ответы на разных серверах обычно занимают 2-3 секунды, если только не происходит несбалансированных соединений. Я запускаю его прямо со своего ноутбука Mac OS X в нашей частной сети.
На днях я подумал, могу ли я регистрировать результаты с течением времени с помощью cron. Я был поражен, обнаружив, что у него были ответы в несколько секунд, например 0,003 секунды. Пытался подключить результаты скрипта к моему рабочему столу с помощью виджета рабочего стола OS X под названием Geektool и увидел похожие сообщения, полученные менее чем за секунду.
Я подозреваю, что разница связана с какой-то ошибкой пользователя - почему-то time wget
Команда, которую я выполняю, не сработает. Может ли кто-нибудь сказать мне, почему время, необходимое для запуска этого скрипта, так сильно различается между пользователем (я запускаю вручную) и системой (cronjob или Geektool), и как я могу исправить это несоответствие?
Вы не показываете свою строку shebang, но, исходя из того, что вы ищете, я бы сказал, что вы запускаете ее под Bash. Если у вас нет линии shebang, вам следует добавить ее. Оболочка Bourne не имеет встроенного time
команда, поэтому она будет использовать /usr/bin/time
который имеет другой формат вывода, чем встроенный в Bash time
.
Поскольку вы используете Bash, вы можете установить выходной формат time
команда с помощью TIMEFORMAT
переменная, поэтому вам не нужно использовать grep
и awk
. Я бы использовал фигурные скобки, чтобы избежать накладных расходов, которые может добавить создание суб-оболочки.
#!/bin/bash
TIMEFORMAT=%R
for host in 192.168.0.7 192.168.0.8 192.168.0.9; do
result=$( { time wget -q --header="Host: domain.tomonitor.com" http://$host/; } 2>&1 )
date=$(date)
echo "$date, $host, $result"
done
Я не знаком с Geektool, поэтому не знаю, как он влияет на ваши результаты. Однако приведенные выше изменения могут повысить согласованность работы сценария в разных средах. Задумывались ли вы о том, намного ли лучше подключение к серверу?
Еще одна вещь, которую нужно проверить, - это увидеть, получаете ли вы ожидаемый ответ на свой wget
команда. Такое маленькое время иногда означает, что вы получаете ошибку. Запуск скрипта в cron
может отправить вам сообщение об ошибке, но вы можете зарегистрировать его, внеся следующие изменения:
result=$( { time wget -q --header="Host: domain.tomonitor.com" http://$host/ >/tmp/wget.$$.out 2>&1; } 2>&1 )
который помещает вывод и сообщения об ошибках из wget
в файл с именем «/tmp/wget.PID.out», где «PID» - это числовой идентификатор процесса. Выход из time
все равно перейдет к переменной.