我想在启动时设置一个服务进程的Affinity和Priority ( 无需修改服务/进程代码,我不拥有代码,这是第三方服务)。
我知道我可以这样做:
$Process = Get-Process MyService $Process.ProcessorAffinity = 4
在PowerShell中更改进程的相关性或在命令path前加上:
cmd.exe /c start "Some Process Name" /affinity 4
但是,这些都不适用于每次启动服务时自动更改服务的进程的相关性和Priority )如何在不使用某些第三方应用程序的情况下重新启动时保持进程亲和性(我真的很喜欢自己编写/创build一个解决scheme,而不是依靠另一个应用程序来“configuration”窗口)。
看看这个post: http : //waynes-world-it.blogspot.ca/2009/06/processor-affinity-on-windows-server.html
如果你想控制一个服务,你可以使用instsrv / srvany来创build一个服务,在真正的服务二进制文件中包装start或者psexec命令。 例如,下面的命令创build只能在第一个处理器上运行的后台打印程序服务的另一个版本。
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"
好吧,我build立在@ Art.Vandelay05的评论和这里(恕我直言最直观 )的解决scheme。
Script.ps1 PowerShell脚本:
$Process = Get-Process <service_process_exe_name_WITHOUT_the_exe>
$Process.ProcessorAffinity = <处理器关联的位代码的hex版本>
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=" <your_service_name> ")]] and *[EventData[Data[@Name="param2"] and (Data="running")]] </Select> </Query> </QueryList>
而已! 现在,每次运行服务时,亲和力都将根据您所写的PowerShell脚本进行设置。
编辑: 确保你的本地用户有Debug Programs权限( pipe理工具/本地安全策略/用户权限分配/debugging程序/添加您的本地用户到这个权利),否则您的用户将无法改变进程的亲和力。