none
Измерение счетчиков производительности удаленного ПК RRS feed

  • Вопрос

  • Подскажите, пожалуйста, как лучше решить следующую задачу.

    Иногда возникает необходимость измерить производительность удаленной клиентской машины.

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

    Хочу реализовать скрипт, который будет запускаться на текущей машине(инженера) и с помощью WMI забирать данные счетчиков и писать их в файл.  Хорошо бы, чтобы все это было в фоновом режиме, т.е инженер запускает скрипт, вводит имя пк, длительность проверки, нажимает ок, скрипт закрывается, а через какое-то время ему на почту приходит письмо о завершении работ и доступности результатов счетчиков.

    Подскажите каким образом это можно лучше всего реализовать?

    Все машины находятся в домене, на большинстве windows XP, powershell установлен только у инженеров. у каждого инженера есть учетная запись, входящая в группу администраторов на клиентстких ПК, но обычно инженеры под ней не сидят.

    Пока что я собираюсь написать два скрипта, один из которых будет запрашивать данные у пользователя и создавать конфигурационный файл для второго скрипта,

    Который в свою очередь будет запускаться из task schedule  и в фоновом режиме забирать данные счетчиков, отправлять отчет о завершении работы.

    Теперь опишу проблемы , с которыми я столкнулся.

    - не удается в task schedule запускать приложение в фоновом режиме.

    - при создании фоновых заданий new-job, start-job они подвисают и не пишут данные в файл.

    Так же есть вопросы, такие как:

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

    Конечно это все напоминает изобретение велосипеда, но все же=)

    Буду рад любым советам и комментариям

    19 сентября 2010 г. 9:21

Ответы

  • Для того, чтобы передавать параметер(ы) внутрь скриптблока, запускаемого в качестве задания, необходимо передавать его внутрь скритблока, как аргумент (параметр) вызова. Для этого надо пользовать параметр -ArgumentList при вызове Start-Job.

    Функции/скритблоки в PowerShel, IIRC, не умеет возвращать значения через параметры вызова. Кроме того, для того, чтобы получить результаты работы задания необходимо пользовать командлет Receive-Job, который вернет вам результаты работы скриптблока-задания. Поэтому ваш скриптблок-задание должен формировать и выдавать результаты своей работы точно так же, как это делает функция. Но, в отличии от функции, для получения результата работы задания вам придется пользовать recieve-job (пока вы этого не сделаете, никаких результатов не увидите).

    см. сюда:

    help about_jobs -full

    help about_job_details

    help start-job -full


    blog: http://shss.wordpress.com/

    • Помечено в качестве ответа Nikolay Golub 19 сентября 2010 г. 15:29
    19 сентября 2010 г. 14:52

Все ответы

  • - не удается в task schedule запускать приложение в фоновом режиме.

    что конкретно не удается?

    - при создании фоновых заданий new-job, start-job они подвисают и не пишут данные в файл.

    покажите - каким образом вы выполнли фоновые задания?

     

    ЗЫ можно попробовать вообще не создавать никаких заданий на удаленных компьютерах, а собирать информацию с компьютера инженера, опрашивая удаленные компьтеры, например при помощи того же WMI. См. в сторону gwmi -list|?{$_.Name -like "*perf*"}| select -ExpandProperty name |sort


    blog: http://shss.wordpress.com/
    19 сентября 2010 г. 10:00
  • "ЗЫ можно попробовать вообще не создавать никаких заданий на удаленных компьютерах, а собирать информацию с компьютера инженера, опрашивая удаленные компьтеры, например при помощи того же WMI. См. в сторону gwmi -list|?{$_.Name -like "*perf*"}| select -ExpandProperty name |sort"

    Так и делаю, но необходимо, чтобы не было видно окна powershell и чтобы на пк мог залогинится другой пользователь.

    Вот так выполняю фоновые задания.

    $c =Get-Credential
    $c
    $computer = "ComputerName"
    $namespace = "root\CIMV2"
    [Array]$result = "this is counter from "+$computer
    $result+="Timestamp,"+"PagesPersec,"+"AvailableMBytes"
    $CollectCounters = Start-Job -Name CollectCounters -ScriptBlock{
        for($i=0; $i -le 200; $i++)
            {
            $Memory = Get-WmiObject -class Win32_PerfFormattedData_PerfOS_Memory -computername $computer -namespace $namespace -Property PagesPersec, AvailableMBytes -Credential $c
            $Memory.PagesPersec
            $Memory.AvailableMBytes
            $result+="Counters,"+ $Memory.PagesPersec + "," + $Memory.AvailableMBytes
            }
    }
    wait-job -job $CollectCounters  #
    $result | Out-File -FilePath C:\temp\job.csv

    19 сентября 2010 г. 12:42
  • Для того, чтобы передавать параметер(ы) внутрь скриптблока, запускаемого в качестве задания, необходимо передавать его внутрь скритблока, как аргумент (параметр) вызова. Для этого надо пользовать параметр -ArgumentList при вызове Start-Job.

    Функции/скритблоки в PowerShel, IIRC, не умеет возвращать значения через параметры вызова. Кроме того, для того, чтобы получить результаты работы задания необходимо пользовать командлет Receive-Job, который вернет вам результаты работы скриптблока-задания. Поэтому ваш скриптблок-задание должен формировать и выдавать результаты своей работы точно так же, как это делает функция. Но, в отличии от функции, для получения результата работы задания вам придется пользовать recieve-job (пока вы этого не сделаете, никаких результатов не увидите).

    см. сюда:

    help about_jobs -full

    help about_job_details

    help start-job -full


    blog: http://shss.wordpress.com/

    • Помечено в качестве ответа Nikolay Golub 19 сентября 2010 г. 15:29
    19 сентября 2010 г. 14:52