낮은 우선 순위로 실행되도록 Windows 서비스 프로세스를 구성하는 방법은 무엇입니까?


17

작업 관리자를 통해 프로세스 우선 순위를 수동으로 변경하지 않고 낮은 우선 순위로 자동 시작되도록 Windows 서비스 프로세스 (예 : squidNT, SQL Server 등)를 구성하는 방법이 있습니까?


코드가 다른 우선 순위로 실행되도록 작성되지 않은 경우 스레드 또는 프로세스의 우선 순위를 변경하는 것은 일반적으로 나쁜 생각입니다. 우선 순위를 변경하면 피할 수있는 동시성 문제 목록에 "우선 순위 반전"이 추가됩니다.
Richard

1
OP는 좋은 아이디어인지 묻지 않았다. OP는 어떻게 할 수 있는지 물었다 . -주제를 계속 기억하십시오. 😉
BrainSlugs83

답변:


11

서비스 시작 / 중지를 처리하는 Service Control Manager에는 시작 프로세스의 우선 순위를 지정하는 메커니즘 (이전의 Windows 버전)이 없습니다.

이미 실행중인 프로세스에서 우선 순위를 수정할 수 있으므로 도구를 사용하여이를 수행하는 것이 가장 좋습니다.

프로세스 우선 순위를 수정하는 Microsoft 명령 줄 도구를 모르지만 http://www.teamcti.com/pview/prcview.htm에 있는 "PV"명령 줄도 우선 순위를 설정하는 기능이 있습니다. .

pv -pb process-name.exe

"process-name.exe"를 "보통 아래"우선 순위로 설정합니다.

프로세스가 변경 될 때까지 프로세스가 "정상"우선 순위에서 시작하여 진행할 수있는 경우, "예약 된 작업"으로 실행되는 스크립트를 사용하여 자주 실행되도록 할 수 있습니다 (서비스가 도착하는 경우) 바운스).

빠르고 더러운 해킹이지만, 일을 끝내는 빠르고 더러운 해킹에 많은 행운이 있습니다!


배치 파일을 실행하여 응용 프로그램을 시작한 다음 응용 프로그램을 직접 실행 한 다음 다른 작업을 실행하여 우선 순위를 설정하는 대신 잠자기 상태로 프로세스 우선 순위를 설정하십시오. 시도해 볼 가치가 있지만 모든 것을 위해 작동하지는 않습니다.
John Gardeniers

3

위의 답변은 저에게 효과적이지 않았습니다. 다음 powershell 스크립트 작성을 종료했습니다.

ChangePriority.ps1

Get-WmiObject Win32_process -Filter 'name="ProcessName.exe"' | ForEach-Object {$_.SetPriority(128)}

그런 다음 5 분마다 호출하는 예약 된 작업을 만들었습니다. 에서 관리자 프롬프트 또는 배치 스크립트 :

schtasks /Create /tn "Process Priority Change" /sc MINUTE /mo 5 /ru SYSTEM /tr "powershell -noprofile -executionpolicy bypass -file \"%cd%\ChangePriority.ps1\""

파일에 의존하지 않고 예약 된 작업이 실패하도록 여기 에서 wmic설명한대로 사용하려고 했습니다. powershell 스크립트를 사용하는 것과 비슷한 점 : 인라인 스크립트로 작업을 만드는 단일 명령을 만들 수 없었습니다. 당신이 그것을하고 다른 답변을 추가하면 감사합니다.

powershell 스크립트의 우선 순위 값은 여기에서 찾을 수 있습니다 [1].

[1] https://docs.microsoft.com/en-us/windows/desktop/cimwin32prov/setpriority-method-in-class-win32-process


매우 유용한. 나는 ps 기술이 열악한 곳에서 서비스 호스트 프로세스를 포함하는 오디오 서비스를 실시간으로 설정하여 CPU 사용량이 많은 동안 오디오 크래킹을 방지합니다 (나쁜 드라이버). 잘 작동합니다!
JasonXA

@JasonXA 천만에요. 당신이 그것의 한 줄 버전을 제공 할 수 있다면 감사
ceztko

물론 : PowerShell.exe -noprofile -executionpolicy 바이 패스 -command "& {Get-WmiObject Win32_service -Filter \"Name = 'AudioSrv'\ "| ForEach {Get-WmiObject Win32_process -Filter \"ProcessId = $ ($ _. ProcessId) \ "} | ForEach-Object {$ _. SetPriority (256)}}"나는 그것이 얼마나 옳은지 모르겠지만 작동합니다. 나는 숨겨져 작동하도록 관리하지 않았으며, 관리자 권한이있는 사용자에서만 작동 할 수 있습니다.
JasonXA

1

다음도 작동 할 수 있습니다. ImagePath 레지스트리 키를 편집하고 cmd.exe의 start 명령을 사용하십시오.

START ["title"] [/Dpath] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
      [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
      [/WAIT] [/B] [command/program]
      [parameters]

불행히도 시작된 실행 파일 ImagePath이 Windows 서비스의 인터페이스를 존중해야하기 때문에 전혀 작동 start하지 않으며이를 실행하거나 실행중인 실행 파일로 라우팅하지 않습니다.
ceztko

0

팀 시티가 CPU를 덜 사용하게하려면 그렇게해야했습니다. 그리고 팀 시티가 우리가 실행하는 유일한 자바 앱이기 때문에 그 솔루션은 완벽하게 작동합니다.

  1. 서비스를 시작 "수동"으로 설정하십시오.
  2. 서비스를 시작하는 배치 파일을 작성하고 다음과 같이 우선 순위를 낮추십시오.

    net start tcbuildagent
    net start teamcity
    wmic 프로세스 여기서 name = "java.exe"CALL setpriority는 "보통"입니다.

  3. "일괄 시작 파일"을 실행하는 "작업 스케줄러"작업을 작성하십시오. 그러면 해당 배치 파일이 시작됩니다.

다른 서비스 시작을 방해하지 않도록 TaskScheduler 트리거를 1 분 지연으로 구성했습니다.

추신 : 또한 모든 서비스 시작을 수동으로 설정하고 해당 배치 파일을 사용하여 원하는 순서대로 모든 서비스를 시작할 수 있습니다! SQL, IIS 등


0

다음 powershell 스크립트를 시작시 실행되는 예약 된 작업에 넣을 수 있습니다.

do {
    start-sleep -s 5
    $obj = Get-WmiObject Win32_process -Filter 'name="processname"'
} while ($obj -eq $null)
$obj.SetPriority(16384)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.