Оснастка PowerShell: данные во время выполнения

Томас Демл

В предыдущих пошаговом руководстве показано, как запрашивать и изменять параметры конфигурации IIS. Однако существует одна неизведаемая область: данные времени выполнения.

Введение

Изменения происходят, и IIS не исключение. Сайты запускаются или останавливаются, пулы приложений перезапускаются или истекает время ожидания, запросы приходят и ответы отправляются, домены приложений создаются или завершаются. IIS реализует интерфейс с именем RSCA (состояние выполнения и API управления), который позволяет отслеживать то, что происходит в системе.

Оснастка IIS PowerShell использует этот интерфейс и открывает некоторые данные через пространство имен оснастки IIS. Состояние сайтов и пулов приложений настраивается с помощью командлетов Get-WebItemState, Start-WebItem, Stop-WebItem и Restart-WebItem. Состояние времени выполнения, например, текущие рабочие процессы, исполняемые в настоящий момент запросы и загруженные домены приложений, предоставляется через пространство имен IIS.

В этом пошаговом руководстве используются сайты, приложения и виртуальные каталоги, созданные в предыдущем пошаговом руководстве.

Состояние сайтов и пула приложений

Мы начнем с запроса состояния наших веб-сайтов.

Состояние сайта

PS IIS:\> cd Sites
PS IIS:\Sites> Get-WebItemState IIS:\Sites\DemoSite
Started

Остановить DemoSite можно с помощью командлета Stop-WebItem:

PS IIS:\Sites> Stop-WebItem DemoSite
PS IIS:\Sites> Get-WebItemState IIS:\Sites\DemoSite
Stopped

Естественно, запуск работает так же:

PS IIS:\Sites> Start-WebItem DemoSite
PS IIS:\Sites> Get-WebItemState IIS:\sites\DemoSite
Started

Состояние AppPool

Мы хотим сделать то же самое для пулов приложений

PS IIS:\> cd AppPools
PS IIS:\AppPools> Get-WebItemState DemoAppPool
Started
PS IIS:\AppPools> Stop-WebItem DemoAppPool
PS IIS:\AppPools> Get-WebItemState DemoAppPool
Stopped

Но есть также свойство состояния, которое можно прочитать на узле AppPools. Давайте развлекаемся с следующим примером. Включите динамики и выполните следующую команду:

dir 'iis:\AppPools' | foreach {[void](new-object -com Sapi.SPVoice).Speak("Application Pool State:");}{$poolState = "Application Pool " + $_.Name +" is " + $_.State;$poolState;[void](new-object -com Sapi.SPVoice).Speak($poolState);}

Теперь запустите DemoAppPool снова:

PS IIS:\AppPools> Start-WebItem DemoAppPool

Переработка AppPools

Одна разница с AppPools заключается в том, что они могут быть переработаны. Командлет для перезапуска AppPools называется Restart-WebItem, а не Recycle-WebItem. PowerShell имеет довольно строгие правила именования, и нам пришлось остановиться на Restart-WebItem. Давайте расширим этот пример немного, добавив...

  1. Выполнение запроса на страницу по умолчанию веб-сайта 'Default Web Site'.
  2. Запрос PID рабочего процесса, который обрабатывает запросы.
  3. Повторное использование пула приложений.
  4. Запросив PID еще раз, чтобы убедиться, что процесс был перезапущен.

1. Запрос страницы по умолчанию

Для запроса http://localhost/используется класс Net.WebClient. Вместо отображения выходных данных на экране мы просто просматриваем длину ответа.

PS IIS:\AppPools> $response = (new-object Net.WebClient).DownloadString("http://localhost/")
PS IIS:\AppPools> $response.Length
689

2. Запрос пин-код рабочего процесса

Если у вас нет других активных веб-сайтов и приложений на компьютере, следующая команда должна возвращать только один пин-код:

PS IIS:\AppPools> get-process w3wp | select processname,id
ProcessName                                                                                      Id
-----------                                                                                      --
w3wp                                                                                           3684

Существует более эффективный способ получить доступ к рабочим процессам, который будет рассмотрен немного позже в этом руководстве.

3. Повторное использование пула приложений

Мы перезапускаем пул приложений с помощью командлета Restart-WebItem:

PS IIS:\AppPools> Restart-WebItem DefaultAppPool

4. Запрос на идентификатор PID рабочего процесса

Если AppPool был успешно перезапущен, ваш идентификатор процесса должен был измениться.

PS IIS:\AppPools> get-process w3wp | select processname,id
ProcessName                                                                                      Id
-----------                                                                                      --
w3wp                                                                                           5860

Рабочие процессы и запросы

Командлет get-process не помогает определить, какой пул приложений обслуживает определенный рабочий процесс. Это можно легко сделать, однако:

PS IIS:\AppPools> dir DefaultAppPool\WorkerProcesses
               processId                  Handles                    state StartTime
               ---------                  -------                    ----- ---------
                    6612                      326                        1 3/28/2008 12:20:27 PM

В настоящее время выполняются запросы

Если ваш сервер не является сервером продуктивной среды, вам будет сложно просмотреть текущие выполняемые запросы. Запрос устарел до тех пор, пока вы не выполните его через Internet Explorer и не вернетесь в консоль PowerShell. Вот небольшая помощь: запрос, который занимает много времени.

Set-Content "$env:systemdrive\inetpub\wwwroot\long.aspx" "<%@ Page language=`"C#`"%><%System.Threading.Thread.Sleep(30000);Response.Write(`"slept for 30 seconds`");%>"

Если вы хотите просмотреть выполняемые в настоящее время запросы, можно ввести следующую команду (ПРИМЕЧАНИЕ. Идентификатор процесса, который необходимо использовать для команды get-item, будет отличаться на компьютере):

PS IIS:\AppPools\DefaultAppPool\WorkerProcesses> dir
Process  State      Handles  Start Time
Id
-------- -----      -------  ----------
6612     Running    737      3/31/2008 8:18:15 AM
PS IIS:\AppPools\DefaultAppPool\WorkerProcesses> (get-item 6612).GetRequests(0).Collection
requestId    : d8000001800000f5
connectionId : d8000001600000f3
verb         : GET
url          : /long.aspx
siteId       : 1

Или если вы хотите узнать, сколько времени уже прошло с момента запуска запроса:

PS IIS:\AppPools\DefaultAppPool\WorkerProcesses> (get-item 6612).GetRequests(0).Collection | select url,timeElapsed
url                                                                                     timeElapsed
---                                                                                     -----------
/long.aspx                                                                                     2637

Сводка

Готово. В этом пошаговом руководстве вы узнали, как запросить состояние пулов приложений и сайтов IIS. Вы узнали, как начать и остановить их. Вы также узнали, как просматривать рабочие процессы и текущие выполняющиеся запросы.