首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >杀死休眠SAP进程的脚本

杀死休眠SAP进程的脚本
EN

Stack Overflow用户
提问于 2016-09-14 09:19:01
回答 1查看 1.5K关注 0票数 3

我们有一个客户端系统,用户通过服务器连接到SAP 9.2。

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

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

今天我回到大约11个SAP进程,根据附在屏幕截图和只有四个用户已经登录,从昨天晚上,没有人登录时,我采取截图。

我的问题是,如何使用TASKKILL或任何其他方法来杀死所有属于而不影响登录用户的休眠进程?

用户在Windows 2012标准版上。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-14 09:55:15

您没有用任何特定的标记(例如批文件powershell )标记您的问题,那么我假设您需要一个批处理文件。无论您使用哪种语言,算法都是相同的,但显然语法是非常不同的(PowerShell脚本非常简单和简短)。

从命令行(当用户登录时,最终使用预定任务或自动启动操作),您可以使用TASKKILL

代码语言:javascript
运行
复制
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):

代码语言:javascript
运行
复制
TASKLIST /V /FO:CSV /FI "IMAGENAME eq sapbo.exe"

它可以使用如下所示进行解析:

代码语言:javascript
运行
复制
FOR /F "delims=, tokens=1-7" %1 IN ('TASKLIST /V /FO:CSV "IMAGENAME eq sapbo.exe"') DO (
    echo %1 %7
)

您需要确定用户是否已登录。如果这是一个交互式会话,您只需检查Windows进程(如果您想做好事情,可以从注册表中读取它.)我知道的最简单的方法是使用来自这个职位的代码

代码语言:javascript
运行
复制
TASKLIST /FI "IMAGENAME eq myapp.exe" 2>NUL | FIND /I /N "myapp.exe">NUL
IF "%ERRORLEVEL%"=="0" ECHO Programm is running

因为如果进程没有登录用户,则需要终止它,然后将其放在DO部件之后(这是一行,这里我只为清楚起见而拆分):

代码语言:javascript
运行
复制
TASKLIST /FI "IMAGENAME eq winlogon.exe" /FI "USERNAME eq %7" 2>NUL
    | FIND /I /N "winlogon.exe" > NUL
    || TASKKILL /T /F /PID %2

别忘了让这段代码适应你的具体情况.

正如我在PowerShell中所说的,这要容易得多。首先,您想让所有的进程都有资格被杀死:

代码语言:javascript
运行
复制
Get-Process sapbo -IncludeUserName

循环遍历它们并检查是否存在交互式会话:

代码语言:javascript
运行
复制
foreach ($eligibleProcess in Get-Process sapbo -IncludeUserName)
{
    if (-not Get-Process winlogon -ErrorAction SilentlyContinue -IncludeUserName | where { $_.UserName -eq $eligibleProcess.UserName })
    {
        $eligibleProcess.Kill();
    }
}

请注意,我在这里写的代码,然后它没有测试,小心.

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39486765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档