Bir Windows hizmet işlemini düşük öncelikli çalışacak şekilde nasıl yapılandırırım?


17

Görev Yöneticisi aracılığıyla işlem önceliğini el ile değiştirmeden bir Windows hizmet işlemini (örn. SquidNT, SQL Server, vb.) Düşük öncelikli otomatik olarak başlayacak şekilde yapılandırmanın bir yolu var mı?


Kod farklı bir öncelikte çalışacak şekilde yazılmadığı sürece, iş parçacıklarının veya işlemlerin önceliğini değiştirmek genellikle kötü bir fikirdir. Öncelikleri değiştirmek, kaçınılması gereken eşzamanlılık sorunları listesine "öncelikli ters çevirme" ekler.
Richard

1
OP iyi bir fikir olup olmadığını sormadı. OP sorulan eğer bitti ve olabilir nasıl . - Lütfen konu üzerinde kalmayı unutmayın. 😉
BrainSlugs83

Yanıtlar:


11

Hizmetlerin başlatılması / durdurulmasıyla ilgilenen Hizmet Denetim Yöneticisi'nin, başlattığı işlemlerin önceliğini belirleyen herhangi bir mekanizması yoktur (şimdiye kadar Windows'un herhangi bir sürümünde).

Zaten çalışan bir işlemde önceliği değiştirebildiğiniz için, en iyi seçeneğiniz bunu yapmak için bir araç kullanmak olabilir.

İşlem önceliğini değiştirmek için bir Microsoft komut satırı aracının farkında değilim, ancak http://www.teamcti.com/pview/prcview.htm adresinde bulunan "PV" komut satırı da önceliği ayarlayacak bir işleve sahip .

pv -pb process-name.exe

Bu, "process-name.exe" yi "Normalin Altında" önceliğine ayarlar.

İşlemi değiştirene kadar "Normal" önceliğinden başlayarak yaşayabiliyorsanız, bunu sık sık kapatmak için "Zamanlanmış Görev" olarak çalışan bir komut dosyasıyla yapabilirsiniz (hizmet alması durumunda) ) geri dönen.

Bu hızlı ve kirli bir hack, ama hayattaki servetimin çoğunu işi bitiren hızlı ve kirli hack'lere borçluyum!


Belki uygulamayı başlatmak için bir toplu iş dosyası çalıştırın ve daha sonra uygulamayı doğrudan çalıştırmak ve daha sonra önceliği ayarlamak için başka bir görev çalıştırmak yerine, aralarında kısa bir uyku ile işlem önceliğini ayarlayın. Her şey için çalışmayacak ama denemeye değer.
John Gardeniers

3

Yukarıdaki cevaplar benim için işe yaramadı. Aşağıdaki powershell betiğini oluşturmayı bitirdim:

ChangePriority.ps1

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

Ve sonra her 5 dakikada bir çağıran zamanlanmış bir görev oluşturdum. Gönderen Yönetici istemi veya toplu komut:

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

wmicTartışıldığı gibi kullanmaya çalışıldıZamanlanan görevin dosyaya bağlı olmamasını sağlamak için burada . Benzer şekilde powershell betiğini kullanarak: Sadece satır içi komut dosyası ile bir görev oluşturan tek bir komut oluşturamadım. Yapmayı ve başka bir cevap eklemeyi başardığınızda teşekkür ederiz.

Powershell betiğindeki öncelik değerleri burada bulunabilir [1].

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


Çok kullanışlı. Ağır cpu kullanımı (kötü sürücüler, sanırım) sırasında ses çatırtısını önlemek için gerçek zamanlı hizmet ana bilgisayar işlemi içeren ses hizmeti ayarlamak için kötü ps becerileri ile bir çizgi doğranmış. Harika çalışıyor!
JasonXA

@JasonXA Bir şey değil. Bunu yapamadığım bir satır sürümünü sağlayabilirseniz
takdir edildim

Elbette: PowerShell.exe -noprofile -executionpolicy bypass -command "& {Get-WmiObject Win32_service -Filter \" Name = 'AudioSrv' \ "| ForEach {Get-WmiObject Win32_process -Filter \" ProcessId = $ ($ _. ProcessId) \ "} | ForEach-Object {$ _. SetPriority (256)}}" Ne kadar doğru olduğunu bilmiyorum ... ama işe yarıyor. Gizli çalışmasını başaramadım, yalnızca yönetici priv w / kullanıcı altında çalışabilir.
JasonXA

1

Aşağıdakiler de işe yarayabilir. ImagePath kayıt defteri anahtarını düzenleyin ve cmd.exe dosyasının start komutunu kullanın:

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

Maalesef, çalıştırılan yürütülebilir dosyanın ImagePathWindows hizmetleri arabirimine saygı duyması gerektiğinden bu hiç işe yaramıyor ve startbunu gerçekleştirmiyor ya da bunu başlatılan yürütülebilir dosyaya yönlendirmeyecek.
ceztko

0

Teamcity'nin daha az işlemci alması için bunu yapmak zorundaydım. Teamcity, çalıştırdığımız tek java uygulaması olduğu için bu çözüm mükemmel çalışıyor.

  1. Hizmeti başlangıç ​​"manuel" olarak ayarlayın.
  2. Hizmetinizi başlatacak ve aşağıdaki gibi önceliği düşürecek bir toplu iş dosyası oluşturun:

    net start tcbuildagent
    net start teamcity
    wmic süreci nerede name = "java.exe" normalin altında "CALL setpriority"

  3. "Windows başlangıcında" başlatılan ve bu toplu dosyayı başlatacak bir "görev zamanlayıcı" işi oluşturun.

TaskScheduler tetikleyicisini 1 dakikalık bir gecikmeyle yapılandırdım, diğer hizmetlerin başlatılmasını engellemem.

ps Ayrıca, tüm hizmet başlangıçlarınızı manuel olarak ayarlayabilir ve hepsini istediğiniz sırayla başlatmak için bu toplu iş dosyasını kullanabilirsiniz! SQL, IIS vb.


0

Aşağıdaki powershell betiğini, başlangıçta çalışan zamanlanmış bir göreve koyabilirsiniz.

do {
    start-sleep -s 5
    $obj = Get-WmiObject Win32_process -Filter 'name="processname"'
} while ($obj -eq $null)
$obj.SetPriority(16384)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.