我想在服务进程启动时设置Affinity
它的Priority
没有修改服务/流程代码,我不拥有代码,它是第三方服务)。
我知道我能做到:
$Process = Get-Process MyService $Process.ProcessorAffinity = 4
在电源外壳更改Affinity
进程或在命令路径前添加前缀:
cmd.exe /c start "Some Process Name" /affinity 4
然而,两者都不这些适用于自动更改服务流程Affinity
的Priority
每次服务已启动)我该怎么做没有使用一些在重启后“维持”进程亲和性的第三方应用程序(我会真的喜欢自己编写/创建解决方案而不是依赖另一个应用程序来“配置”窗口)。
答案1
看看这篇文章: http://waynes-world-it.blogspot.ca/2009/06/processor-affinity-on-windows-server.html
如果您尝试控制某项服务,则可以使用 instsrv/srvany 创建一个服务,该服务将 start 或 psexec 命令包装在实际服务二进制文件中。例如,以下命令创建了另一个版本的后台处理程序服务,该服务仅在第一个处理器上运行。
instsrv Test c:\util\srvany.exe reg add hklm\system\currentcontrolset\services\test\Parameters reg add hklm\system\currentcontrolset\services\test\Parameters /v Application /t reg_sz /d cmd.exe reg add hklm\system\currentcontrolset\services\test\Parameters /v AppParameters /t reg_sz /d "/c start /affinity 1 C:\WINDOWS\system32\spoolsv.exe"
答案2
好的,我根据@Art.Vandelay05的评论进行了补充,以下是(在我看来最直觉的) 解决方案。
Script.ps1
使用以下行创建PowerShell 脚本:
$Process = Get-Process
< 服务进程 exe 名称_不包含 exe >
$Process.ProcessorAffinity =
< 处理器亲和性的十六进制位码版本 >- 转到
Administrative Tools/Task Scheduler
并且Create Task...
(不是Create Basic Task
) - 常规选项卡
- 无论用户是否登录,都检查运行
- 更改用户或组到您机器上的本地用户
- 触发器
- 新的...
- 已启用
- 开始任务在一次活动中
- 编辑事件过滤器
- 使用一点
XSLT
来找到服务启动的消息。我使用了:
<QueryList> <Query Id="0" Path="System"> <Select Path="System"> *[EventData[Data[@Name="param1"] and (Data="
< 你的服务名称 > ")]] and *[EventData[Data[@Name="param2"] and (Data="running")]] </Select> </Query> </QueryList>
- 操作
- 行动启动程序
- 程序/脚本:执行程序
- 添加参数(可选):-文件“path_to_script\Script.ps1”
就是这样!现在,每次您的服务运行时,亲和性都会根据您编写的 PowerShell 脚本进行设置。
编辑:
制作当然您的本地用户有权Debug Programs
(管理工具/本地安全策略/用户权限分配/调试程序/ 将您的本地用户添加到此权限)或您的用户惯于能够改变进程的亲和力。