Поделиться через


Оснастка 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 называется Restart-WebItem, а не Recycle-WebItem. В PowerShell есть довольно строгие правила именования, и нам пришлось согласиться на Restart-WebItem. Давайте немного развернем этот пример на

  1. Отправка запроса на страницу по умолчанию веб-сайта по умолчанию.
  2. Запрос к ИДЕНТИФИКАТОРу рабочего процесса обрабатывается.
  3. Перезапуск пула приложений.
  4. Запрос PID еще раз, чтобы убедиться, что процесс был перезапущен.

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

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

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

2. Запрос PID рабочего процесса

Если на компьютере нет других активных веб-сайтов и приложений, следующая команда должна возвращать только один ИДЕНТИФИКАТОР:

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

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

Если ваш компьютер не является рабочим компьютером, вам будет трудно присмотреться к выполнению запросов в настоящее время. Запрос давно не выполняется, пока вы не сделаете запрос через Интернет Обозреватель и не вернетесь в консоль 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. Вы узнали, как начать и остановить их. Вы также узнали, как рассматривать рабочие процессы и выполняемые в настоящее время запросы.