脚本来杀死休眠的SAP进程

问题描述:

我们有一个客户端系统,用户通过服务器连接到SAP 9.2。脚本来杀死休眠的SAP进程

当用户在Web上运行SAP 9.2时,SAP将在服务器上启动一个exe进程,就像运行SAP客户端应用程序时一样。一旦用户完成了SAP的工作,通常用户将不会选择文件并退出,但会在SAP已关闭的情况下关闭选项卡。

在服务器上SAP EXE进程没有关闭,昨天我注意到服务器内存已满(100%利用率),而只有一个用户登录。在任务管理器上,我们有超过100个SAP EXE进程正在运行。我不得不手动关闭所有的服务,之后网站上的SAP 9.2开始顺利运行。

今天我回到11个左右的SAP进程,按照附图的截图,只有4个用户自昨天晚上开始登录,当我截图时没有人登录。

enter image description here

我的问题是,如何才能让使用TASKKILL或任何其他方法来杀死属于所有休眠进程到SAP Business One在用户不影响登录?

用户在Windows Server 2012标准版上。

你没有用任何特定的标签标记你的问题(例如),那么我假设你想要一个批处理文件。 算法与使用的语言无关,但语法明显不同(PowerShell脚本更容易和更简单)。

从命令行(然后最终与计划任务,当用户登录时,在自动起动操作),可以使用TASKKILL

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

几点注意事项:

  • 更换imagename.exe与图像名称SAP Business One过程(使用TASKLIST检查它),或者您可以使用WINDOWTITLE过滤器。
  • 如果用户在域中登录,则可能需要用%USERDOMAIN%\%USERNAME%替换%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 
) 

您需要确定用户是否已登录。因为你需要

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

:如果这是你可能只是检查Windows Shell程序的交互式会话最简单的方法,我知道是从this post使用代码(从注册表,如果你想要做的事情做好......阅读)杀死进程,如果还没有登录的用户,然后把这个后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

好的。两种方式:批处理文件和PowerShell都很好理解 –