我们有一个客户端系统,用户通过服务器连接到SAP 9.2。
当用户在web上运行SAP9.2时,SAP在服务器上启动一个exe进程,就像运行SAP客户端应用程序时一样。一旦用户完成了SAP的工作,通常用户不会选择文件和退出,而是在SAP已经关闭的情况下关闭选项卡。
在服务器上,SAP进程没有关闭,昨天我注意到服务器内存已满(利用率为100%),而只有一个用户登录。在任务管理器上,我们有超过100个SAP进程正在运行。我不得不手动关闭所有的服务,在此之后,SAP 9.2在网络上开始顺利运行。
今天我回到大约11个SAP进程,根据附在屏幕截图和只有四个用户已经登录,从昨天晚上,没有人登录时,我采取截图。
我的问题是,如何使用TASKKILL或任何其他方法来杀死所有属于而不影响登录用户的休眠进程?
用户在Windows 2012标准版上。
发布于 2016-09-14 09:55:15
您没有用任何特定的标记(例如批文件或powershell )标记您的问题,那么我假设您需要一个批处理文件。无论您使用哪种语言,算法都是相同的,但显然语法是非常不同的(PowerShell脚本非常简单和简短)。
从命令行(当用户登录时,最终使用预定任务或自动启动操作),您可以使用TASKKILL
。
TASKKILL /FI "IMAGENAME eq imagename.exe" /FI "USERNAME ne %USERNAME%" /T /F
很少有人注意到:
imagename.exe
替换为SAP流程的映像名称(使用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进程(如果您想做好事情,可以从注册表中读取它.)我知道的最简单的方法是使用来自这个职位的代码
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();
}
}
请注意,我在这里写的代码,然后它没有测试,小心.
https://stackoverflow.com/questions/39486765
复制相似问题