2016-09-14 7 views
3

У нас есть клиентская система, с которой пользователи подключаются к SAP 9.2 через сервер.Сценарий для уничтожения неактивных процессов SAP

Когда пользователь запускает SAP 9.2 в Интернете, SAP инициирует exe-процесс на сервере, как и при запуске клиентского приложения SAP. Как только пользователь будет работать с SAP, обычно пользователь не будет выбирать файл и выйти, но просто закрывает вкладку, предполагая, что SAP закрыт.

На сервере процесс exe SAP не закрыт, вчера я заметил, что память сервера была заполнена (100% -ная загрузка), в то время как только один пользователь был зарегистрирован. В диспетчере задач было выполнено более 100 процессов SAP exe. Мне пришлось вручную закрыть все службы, после чего система SAP 9.2 в сети начала работать плавно.

Сегодня я вернулся к 11 или около того процессов SAP в соответствии с прилагаемым скриншотом, и только четыре пользователя вошли в систему со вчерашнего вечера, и никто не вошел в систему, когда я сделал снимок экрана.

enter image description here

Мой вопрос, как я могу использовать Taskkill или любым другим способом, чтобы убить все спящие процессы, которые принадлежат к SAP Business One и не аффект авторизованы пользователей?

Пользователи находятся на стандартной версии Windows Server 2012.

ответ

2

Вы не отметили свой вопрос каким-либо конкретным тегом (например, или ), тогда я предполагаю, что вы хотите командный файл. Алгоритм тот же, независимо от того, какой язык вы используете, но, очевидно, синтаксис довольно разный (сценарий PowerShell намного проще и короче).

Из командной строки (то в конечном итоге с запланированной задачи или операции автозапуск, когда пользователь входит в сеть), вы можете использовать TASKKILL:

TASKKILL /FI "IMAGENAME eq imagename.exe" /FI "USERNAME ne %USERNAME%" /T /F 

Несколько заметок:

  • Заменить imagename.exe с image name Процесс SAP Business One (проверьте его с помощью TASKLIST), в качестве альтернативы вы можете использовать фильтр WINDOWTITLE.
  • Если пользователи вошли в систему под доменом, вы можете заменить %USERNAME% на %USERDOMAIN%\%USERNAME%.
  • /F выключатель принудительно закрыть указанный процесс, сделать это, только если нежный не работает.
  • /T закрывает процесс и все его дети (я вижу, что некоторые из этих процессов имеют детей).
  • Проверить TASKKILL справку для получения дополнительных фильтров, обратите внимание, что это убьет все процессы, которые не принадлежат пользователю, который в настоящий момент вошел в систему, который выполняет эту команду. Он имеет одно очевидное значение: у входа в систему пользователь должен иметь требуемые разрешения, и у вас есть только один зарегистрированный пользователь в любое время.

Последствия последней точки как-то огромны, и все будет сложнее, если вам нужно обойти это.Учитывая, что вы можете получить подробную информацию о процессе с помощью TASKLIST /V и вы можете форматировать вывод в удобном формате с использованием (предположим, для этого примера, что имя процесса изображения sapbo.exe):

TASKLIST /V /FO:CSV /FI "IMAGENAME eq sapbo.exe" 

который может быть разобран используя что-то например:

FOR /F "delims=, tokens=1-7" %1 IN ('TASKLIST /V /FO:CSV "IMAGENAME eq sapbo.exe"') DO (
    echo %1 %7 
) 

Необходимо определить, вошел ли пользователь в систему или нет. Если это интерактивный сеанс вы можете просто проверить процесс оболочки Windows (прочитать его из реестра, если вы хотите сделать что-то хорошо ...) Простейший способ я знаю, чтобы использовать код из this post:

TASKLIST /FI "IMAGENAME eq myapp.exe" 2>NUL | FIND /I /N "myapp.exe">NUL 
IF "%ERRORLEVEL%"=="0" ECHO Programm is running 

Потому что вам нужно чтобы убить процесс, если он не вошедшего в пользователь затем поместить это после того, как DO части (это одна линия, то здесь я расколоть только для ясности):

TASKLIST /FI "IMAGENAME eq winlogon.exe" /FI "USERNAME eq %7" 2>NUL 
    | FIND /I /N "winlogon.exe" > NUL 
    || TASKKILL /T /F /PID %2 

не забудьте адаптировать этот код для вашего конкретного случая ...


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

Get-Process sapbo -IncludeUserName 

Петля через них и проверить, есть ли интерактивная сессия:

foreach ($eligibleProcess in Get-Process sapbo -IncludeUserName) 
{ 
    if (-not Get-Process winlogon -ErrorAction SilentlyContinue -IncludeUserName | where { $_.UserName -eq $eligibleProcess.UserName }) 
    { 
     $eligibleProcess.Kill(); 
    } 
} 

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

+0

Ok. Оба способа: командный файл и powershell хорошо знать –

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

  • Нет связанных вопросов^_^