Назад | Перейти на главную страницу

Почему время, необходимое для запуска этого скрипта, так сильно различается между пользователем и системой, и как я могу исправить это несоответствие?

Мое приложение находится за балансировщиком нагрузки, и время от времени мне нравится проверять состояние на каждой машине, чтобы получить представление о времени, которое требуется для возврата документа 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. Это greps для "реального" времени и 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 все равно перейдет к переменной.