2012-05-11 3 views
1

Я использую PowerShell для ежечасной проверки, чтобы проверить, работает ли процесс «ASA». Если нет, перезапустите его. Используя фрагмент кода, найденный из ответа jon Z в приведенной ниже ссылке, он отлично работает. Может быть, слишком хорошо? Powershell - if a process is not running, start itПроверка процесса PowerShell запускает слишком много процессов

У меня есть запланированная задача, которая запускает этот скрипт каждый час в течение 24 часов. Проблема Я замечаю, что у меня есть куча ASA процессов открытой, когда мне нужно только & хочет 1.

enter image description here

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

# Set some variables 
$computer = $env:COMPUTERNAME 
$prog = "C:\Program Files\Avaya\Site Administration\bin\ASA.exe" 
$procName = "ASA" 
$running = Get-Process $procName -ErrorAction SilentlyContinue 
$start = ([wmiclass]"win32_process").Create($prog) # the process is created on this line 

# Begin process check 
if($running -eq $null) { # evaluating if the program is running 
    $start # Start the program 
    sleep 5 
    # Re-check the process to see if it is running 
    $nowRunning = Get-Process $procName -ErrorAction SilentlyContinue 
    # Email us the results as to whether it started or was not able to restart. 
    if ($nowRunning -eq $null) { 
     blat.exe - -priority 1 -to [email protected] -server my.smtp.com -f [email protected] -subject "ASA cannot be restarted on $computer!" -body "The latest powershell check showed that ASA was not running on $computer! ||PowerShell was not able to restart ASA. Please investigate." 
     } else { 
     blat.exe - -priority 1 -to [email protected] -server my.smtp.com -f [email protected] -subject "ASA was restarted on $computer!" -body "The latest powershell check showed that ASA was not running on $computer! ||PowerShell was able to automatically restart ASA." 
    } 
} 

Мой первый предположение, что имя процесса было неправильно, и это должно быть имя программы, как это определено в диспетчере задач. Однако в соответствии с этим результатом, просто используя ASA, это правильно.

enter image description here

Так что я застрял, почему он начинает несколько экземпляров.

ответ

1

Каждый раз, когда ваш скрипт выполняется он создает процесс в этой строке:

$start = ([wmiclass]"win32_process").Create($prog) # the process is created on this line 

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

Вы должны изменить его, как этот

$start = '([wmiclass]"win32_process").Create($prog)' 

и после if заявления назвать это так:

invoke-expression $start 
+0

Работал как шарм. Единственное, что я вижу сейчас, - это процесс, выполняемый как «NETWORK SERVICE». Как я могу запустить процесс в качестве учетной записи пользователя, поэтому, когда я вхожу в систему, я могу видеть и использовать программу? – Pat

+0

Вы должны изменить учетные данные в планировщике задач с помощью вашего пользователя & pw –

+0

Я сделал это до этого вопроса (как вы можете видеть на моих скриншотах выше, в нем было много их как мое имя пользователя). Когда я выполнил ваше исправление и перезагрузил свою машину, он запустил скрипт как NETWORK SERVICE. Любые другие мысли? Может ли PowerShell вызывать выражение как пользователя? – Pat

Смежные вопросы