Làm cách nào để định cấu hình quy trình dịch vụ Windows để chạy với mức độ ưu tiên thấp?


16

Có cách nào để định cấu hình quy trình dịch vụ Windows (ví dụ: squidNT, SQL Server, v.v.) để bắt đầu tự động với mức độ ưu tiên thấp mà không thay đổi ưu tiên quy trình theo cách thủ công thông qua Trình quản lý tác vụ không?


Thay đổi mức độ ưu tiên của luồng hoặc tiến trình thường là một ý tưởng tồi, trừ khi mã được viết để chạy ở mức ưu tiên khác. Thay đổi các ưu tiên sẽ thêm "đảo ngược ưu tiên" vào danh sách các vấn đề tương tranh cần tránh.
Richard

1
OP đã không hỏi liệu đó có phải là một ý tưởng tốt hay không. OP hỏi nếu nó có thể được thực hiện, và làm thế nào . - Hãy nhớ ở lại trên chủ đề. 😉
BrainSlugs83

Câu trả lời:


11

Trình quản lý điều khiển dịch vụ, xử lý các dịch vụ khởi động / dừng, không có bất kỳ cơ chế nào (trong bất kỳ phiên bản nào của Windows heretofore) để chỉ định mức độ ưu tiên cho các quy trình mà nó khởi động.

Vì bạn có thể sửa đổi mức độ ưu tiên trong quy trình đã chạy, nên cách tốt nhất của bạn có thể là sử dụng một công cụ để thực hiện điều đó.

Tôi không biết về công cụ dòng lệnh của Microsoft để sửa đổi mức độ ưu tiên của quy trình, nhưng dòng lệnh "PV" cũng vậy, có sẵn tại địa chỉ http://www.teamcti.com/pview/prcview.htmlm có chức năng đặt mức độ ưu tiên .

pv -pb process-name.exe

Điều đó sẽ đặt ưu tiên "process-name.exe" thành "Dưới mức bình thường".

Nếu bạn có thể sống với quy trình bắt đầu ở mức ưu tiên "Bình thường" cho đến khi bạn bắt đầu thay đổi nó, bạn có thể làm như vậy với một tập lệnh chạy dưới dạng "Tác vụ theo lịch trình" để tắt mọi lúc (trong trường hợp dịch vụ được bị trả lại).

Đó là một vụ hack nhanh chóng và bẩn thỉu, nhưng tôi nợ rất nhiều tài sản của mình trong cuộc sống với những vụ hack nhanh chóng và bẩn thỉu để hoàn thành công việc!


Có thể chạy một tệp bó để khởi động ứng dụng và sau đó đặt mức độ ưu tiên của quy trình, có lẽ là một giấc ngủ ngắn ở giữa, thay vì chạy ứng dụng trực tiếp và sau đó chạy một tác vụ khác để đặt mức độ ưu tiên. Sẽ không làm việc cho tất cả mọi thứ nhưng đáng thử.
John Gardeniers

3

Câu trả lời trên không làm việc cho tôi. Tôi đã kết thúc việc tạo tập lệnh powershell sau:

ChangeP Warriority.ps1

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

Và sau đó tôi đã tạo ra một nhiệm vụ theo lịch trình gọi nó cứ sau 5 phút. Từ lời nhắc của Quản trị viên hoặc tập lệnh bó:

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

Đã cố sử dụng wmicnhư đã thảo luận ở đây để thực hiện tác vụ theo lịch trình không phụ thuộc vào tệp không thành công. Similary sử dụng tập lệnh powershell: Tôi không thể tạo một lệnh duy nhất mà chỉ tạo một tác vụ với tập lệnh nội tuyến. Đánh giá cao nếu bạn quản lý để làm điều đó và thêm một câu trả lời khác.

Các giá trị ưu tiên trong tập lệnh powershell có thể được tìm thấy ở đây [1].

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


Rất hữu ích. Tôi đã cắt một dòng với các kỹ năng ps kém của mình để đặt dịch vụ âm thanh chứa quy trình lưu trữ dịch vụ thành thời gian thực để ngăn chặn âm thanh bị vỡ trong quá trình sử dụng cpu nặng (trình điều khiển xấu, tôi đoán vậy). Hoạt động tuyệt vời!
JasonXA

@JasonXA Bạn được chào đón. Đánh giá cao nếu bạn có thể cung cấp phiên bản một dòng của nó, mà tôi không thể
ceztko

Chắc chắn: PowerShell.exe -noprofile -executpolicy bypass -command "& {Get-WmiObject Win32_service -Filter \" Name = 'AudioSrv' \ "| ForEach {Get-WmiObject Win32_ process -Filter \" ProcessI \ "} | ForEach-Object {$ _. SetP Warriority (256)}}" Tôi không biết nó đúng như thế nào ... nhưng nó hoạt động. Tôi đã không quản lý để làm cho nó hoạt động ẩn, chỉ có thể hoạt động dưới quyền người dùng w / admin private.
JasonXA

1

Sau đây cũng có thể làm việc. Chỉnh sửa khoá đăng ký ImagePath và sử dụng lệnh start từ cmd.exe:

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

Thật không may, điều này hoàn toàn không hoạt động vì chương trình thực thi được khởi chạy ImagePathphải tôn trọng giao diện cho các dịch vụ Windows và startkhông triển khai cũng như không định tuyến điều này đến chương trình thực thi được khởi chạy.
ceztko

0

Tôi đã phải làm điều đó để làm cho teamcity mất ít cpu hơn. Và, bởi vì teamcity là ứng dụng java duy nhất chúng tôi đang chạy, giải pháp đó hoạt động hoàn hảo.

  1. Đặt dịch vụ là khởi động "thủ công".
  2. Tạo một tệp bó, sẽ bắt đầu dịch vụ của bạn và hạ mức độ ưu tiên, như:

    net start tcbuildagent
    net start teamcity
    wmic process where name = "java.exe" CALL setp Warriority "dưới mức bình thường"

  3. Tạo một công việc "lập lịch tác vụ", được kích hoạt tại "windows startup", sẽ khởi chạy tệp bó đó.

Tôi đã cấu hình trình kích hoạt TaskScheduler với độ trễ 1 phút để không can thiệp vào các dịch vụ khác bắt đầu.

ps bạn cũng có thể đặt tất cả các dịch vụ của mình khởi động thành thủ công và sử dụng tệp bó đó để bắt đầu tất cả chúng theo thứ tự bạn muốn! SQL, IIS, v.v.


0

Bạn có thể tập lệnh powershell sau, đặt nó vào một tác vụ theo lịch trình chạy khi khởi động.

do {
    start-sleep -s 5
    $obj = Get-WmiObject Win32_process -Filter 'name="processname"'
} while ($obj -eq $null)
$obj.SetPriority(16384)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.