কোনও ব্যাচ কেবলমাত্র সেমিডিয়ার চালিত অগ্রাধিকারটিকে কীভাবে কম করতে পারে?


1

আমার একটি ব্যাচ রয়েছে যা একটি সিরিজ কমান্ড চালায় যা দীর্ঘ এবং সিপিইউ নিবিড় হবে। এটি শেষ হয়ে গেলে আমার আপত্তি নেই তাই আমি কেবল নিষ্ক্রিয় সিপিইউ চক্র ব্যবহার করতে পছন্দ করব। যদি আমি cmd.exeএকই ব্যাচে ব্যাচটি চালাচ্ছি (কিছু ) প্রক্রিয়াটির অগ্রাধিকারটি সেট করি তবে যে কোনও শিশু প্রক্রিয়াটির অগ্রাধিকারটি উত্তরাধিকার সূত্রে হওয়া উচিত। আমি জানি আপনি ব্যবহার করে কোনও প্রক্রিয়া অগ্রাধিকার পরিবর্তনwmic করতে পারেন । উদাহরণ স্বরূপ:

wmic process where name="cmd.exe" CALL setpriority "idle"

প্রকৃতপক্ষে চাকরীটি তৈরি করবে তবে এটি cmd.exeতখন চলমান অন্য যে কোনও ঘটনাও কমিয়ে দেবে , যা সর্বদা উপযুক্ত নাও হতে পারে।

কোন প্রক্রিয়াটি ব্যাচটি পরিচালনা করছে এবং এটির অগ্রাধিকার কেবল সেট করা আছে তা চিহ্নিত করার কোনও উপায় আছে idle?

স্পষ্ট করার জন্য: আমি একটি সাধারণ পদ্ধতি খুঁজছি যা আপনি এই ধরণের যে কোনও ব্যাচে বা কোনও ব্যাচকে অন্তর্ভুক্ত করতে পারেন যা যে .batকেউ নামিয়ে আনতে ডাকতে পারে।

এটি এমন একটি সমস্যা যা মাঝে মাঝে আমি খুঁজে পাই তবে একটি নির্দিষ্টভাবে .batআমি এখন লিখছি, আমি একবারে একটি প্রক্রিয়া করার জন্য একটি পরিবর্তনশীল সংখ্যক ফাইল পাস করি।

উত্তর:


2

একটি পদ্ধতির পিআইডি (যা "প্রক্রিয়া আইডি" এর জন্য সংক্ষিপ্ত) সন্ধানের মাধ্যমে শুরু করা start

ডাব্লুএমআইসি প্রক্রিয়া ভূমিকা কেবল অগ্রাধিকার সেট করার চেয়ে আরও বেশি সমর্থন করে। আপনি বিশদ পেতে পারেন। উদাহরণস্বরূপ নিম্নলিখিতগুলি (একক লাইনে চালানো):

WMIC process where name="cmd.exe" get Caption,CommandLine,Name,ParentProcessId,ProcessId /FORMAT:LIST

(স্বাভাবিকভাবেই, এটি আপনার প্রশ্নের নমুনার মতো একটি traditionalতিহ্যবাহী কমান্ড প্রম্পট থেকে চালিত হতে বোঝায় Power পাওয়ারশেল ব্যবহারের জন্য অতিরিক্ত পালানোর দরকার পড়বে))

তবে আপনার কাছে সিএমডি.এক্সইএর একাধিক কপি থাকতে পারে যা কিছু সমস্যা তৈরি করতে পারে। আপনার ব্যাচ ফাইলটি কীভাবে শুরু করা হয় তার উপর যদি আপনার কিছুটা নিয়ন্ত্রণ থাকে তবে এটি আরও সহজ হতে পারে। ডিনের স্ট্যাকওভারফ্লো ডটকম প্রশ্ন, "ব্যাট ফাইলে চলমান এক্সের প্রসেস আইডি পাওয়া" পিআইডিকে পরিবেশের ভেরিয়েবলে আনতে একাধিক সমাধান সরবরাহ করে। আমি আপনাকে পরামর্শ দিচ্ছি যে কোনটি আপনার পক্ষে সবচেয়ে সুখকর দেখায় তা নির্ধারণ করার জন্য আপনি সেই সমাধানগুলি সন্ধান করুন তবে এখানে একটি সম্ভাব্য পন্থা:

C:\> wmic Process WHERE "CommandLine LIKE '%%MyProgWMICflag%%'" Get ParentProcessID /format:list

এটি আপনাকে ডাব্লুএমআইসি কমান্ডের প্যারেন্টপ্রসেসিডটি দেখাতে পারে, যা ডাব্লুএমআইসি (সম্ভবত আপনার শেল) নামক প্রোগ্রামটির পিআইডি হবে।

এটি পিআইডি প্রাপ্তির সমাধানগুলির উপরের হাইপার-লিঙ্কযুক্ত পৃষ্ঠায় ফক্সিড্রাইভের উত্তরের ভিত্তিতে তৈরি। (এই উত্তরটি যদি আপনি চান তবে এটি পরিবেশের পরিবর্তনশীল হিসাবে রূপান্তরিত করে তাও দেখায়))

তারপরে, আপনার WHERE ধারাটিতে প্রসেসআইড অন্তর্ভুক্ত করুন। উদাহরণ:

WMIC process where "name='cmd.exe' AND ProcessId='12345'" CALL setpriority "idle"

দ্রষ্টব্য: এটি কেবল একটি পদ্ধতির। এমন আরও কিছু সাধারণ বৈশিষ্ট্য থাকতে পারে যা আপনি যা পরীক্ষা করতে পারছেন তা ভাল। আপনি এমন কিছু ব্যবহার করে যাচাই করতে উপলভ্য বৈশিষ্ট্যগুলির একটি তালিকা দেখতে পারেন:
WMIC /OUTPUT:"Results.txt" Process Get /FORMAT:LIST


সুতরাং এটি সমস্ত আসল cmd.exeপিআইডি নির্দিষ্ট করে ফোটায়। এটি প্রায় একটি উত্তর। তবে এখনই আমি এটি করার কোনও উপায় ভাবতে পারি না। আমি এই চিন্তাটি পটভূমিতে প্রেরণ করব। হয়তো কিছু ধারণা হাজির।
cdlvcdlv

ওয়েল, এজন্যই আমি উল্লেখ করেছি যে ডিনের স্ট্যাকওভারফ্লো ডটকম প্রশ্ন, "ব্যাট ফাইলে চলমান এক্সের প্রক্রিয়া আইডি পাওয়া" একাধিক সমাধান সরবরাহ করে। কোন পদ্ধতির (সেই উত্তরে উল্লিখিত) আপনার পক্ষে সবচেয়ে সুবিধাজনক হতে পারে তা অনুমান করার চেষ্টা করার মধ্যে আমি কোনও লাভ দেখিনি এবং তারপরে অন্যান্য সম্ভাব্য সমাধানগুলির বিশদটি রেখে গিয়ে সেই পদ্ধতি থেকে তথ্যটি অনুলিপি করার চেষ্টা করেছি। আমি
এটির

আমি এই প্রশ্নটি পেয়েছি এবং এটিতে কাজ করছি কিন্তু %% মাইপ্রোগ ডাব্লুআইআইসিফ্ল্যাগ %% কৌশলটি চতুর!
cdlvcdlv

0

আপনি (অন্য ব্যাচ থেকে) শুরু সঙ্গে আপনার ব্যাচ চালানোর জন্য প্রয়োজন হবে - তারপর শুরু পৃথক অগ্রাধিকার সেট করা যেতে পারে

START "" batch.bat /B /LOW

সম্ভবত আমি ভাল ব্যাখ্যা না। আমি জানি আপনি এইভাবে কম অগ্রাধিকার দিয়ে প্রক্রিয়া শুরু করতে পারেন, তবে এটি আমার .batএই ধরণের প্রতিটিটির জন্য একটি লঞ্চার তৈরি করতে বাধ্য করবে । আমি যা খুঁজছিলাম তা হ'ল একটি সাধারণ পদ্ধতি যা আপনি এই জাতীয় কোনও ব্যাচে অন্তর্ভুক্ত করতে পারেন। বা এমন একটি ব্যাচ যা .batনামিয়ে আনতে কল করতে পারে।
cdlvcdlv

@cdlvcdlv আমাকে prnwatch.com/prio এর সাথে পুনর্বার সমালোচনা করা হয়েছিল - সম্ভবত এটি আপনাকে সহায়তা করবে
গেমার0

0

এটি এমন একটি কাজ যা আপনি আপনার ব্যাচের অগ্রাধিকার সেট করতে অন্যের কাছ থেকে ব্যবহার করতে পারেন। আপনি যদি এটি কোনও ডিরেক্টরিতে এটি অনুলিপি করেন তবে আপনি যথারীতি যে কোনও সময় এটিকে কল করতে পারেন ইত্যাদি। টোগামকে ধন্যবাদ , এটি আমাকে লেখার সরঞ্জাম এবং পদ্ধতি দিয়েছে। পরিবর্তনশীল নিশ্চিত করে যে পিনপয়েন্টেড প্রক্রিয়াটি ঠিক আপনার প্রয়োজন এবং আপনার ব্যাচের অন্য কোনও উদাহরণ নয় (অসম্ভব, তবে সম্ভাব্য দৃশ্য)।SetMyPrio.bat MyPrio.bat%PATH%UniqueString

@echo off

GOTO :EndOfReminder

<HELP>

USAGE:

From any batch file or command prompt, write
   CALL MyPrio [/?|/h] [<priority>|get]
to set the priority of the caller cmd. Default for <priority> is idle.

/?, /h        This help.

<priority>    If you want your priority change to 
                 idle          -- no parameter, 64, idle or "idle"
                 below normal  -- 16384 or "below normal"
                 normal        -- 32, normal or "normal"
                 above normal  -- 32768 or "above normal"
                 high priority -- 128 or "high priority"
                 real time     -- 256, realtime or "realtime"
get           Returns current priority as errorlevel

TO DO
   - Parameter error control.
   - Support for Unicode characters in help.
</HELP>

:EndOfReminder
setlocal
set Priority=%~1

if /I ["%Priority%"]==["/h"] ( call :PrintHelp & exit /b )
if ["%Priority%"]==["/?"] ( call :PrintHelp & exit /b )

set UniqueString=%RANDOM%-%RANDOM%-%RANDOM%-%RANDOM%-%RANDOM%

if ["%Priority%"]==["get"] for /f "usebackq tokens=2 delims==" %%a in (`wmic Process WHERE "name='cmd.exe' AND CommandLine LIKE '%%%UniqueString%%%'" Get Priority /format:LIST`) do exit /b %%a

if not defined Priority set Priority=idle
for /f "usebackq tokens=2 delims==" %%a in (`wmic Process WHERE "name='cmd.exe' AND CommandLine LIKE '%%%UniqueString%%%'" Get ParentProcessID /format:LIST`) do set myPID=%%a
wmic process where "ProcessId='%myPID%'" CALL setpriority "%Priority%" > nul 2>&1

endlocal
goto :eof

:PrintHelp
setlocal DisableDelayedExpansion
call :eln 0
set "levelerror=^%%errorlevel^%%"
for /F "delims=" %%a in ('find /v /n "" "%~f0"') do (
   set "line=%%a"

   REM We store errorlevel in tmpel because setlocal will set errorlevel to 0...
   call set tmpel=%levelerror%
   setlocal EnableDelayedExpansion
   REM ... and now we restore it
   REM %levelerror% was expanded to %errorlevel% before running the iteration
   REM and the CALL SET allows actual errorlevel be stored in tmpel
   REM Finally, we set errorlevel again
   call :eln !tmpel!

   set "line=!line:*]=!"

   if /i "!line!"=="</HELP>" exit /b 0
   if errorlevel 1 echo(!line!
   if /i "!line!"=="<HELP>" call :eln 1
REM errorlevel is the only value that survives the following endlocal
   endlocal
)
exit /b 1

:eln
REM Sets errorlevel to %1
exit /b %1

সম্পাদনা করুন (2018-06-12)

  • নাম পরিবর্তিত MyPrio যুক্ত অপশন /?, /hএবং get
  • বিকল্প /?এবং /hটেক্সট আপনার মধ্যে অনুস্মারক লিখতে প্রিন্ট <HELP>এবং </HELP>। আপনার প্রয়োজন মতো অন্য কোনও ব্যাচে এই পদ্ধতিটি পুনরায় ব্যবহার করা যেতে পারে।

আপনি যদি MyPrio.batকোনও ব্যাচের শুরুতে কল করেন, যে কোনও সময় আপনি এটি শুরু করেন, কোনও কমান্ড লাইন থেকে বা উইন্ডোজ এক্সপ্লোরার থেকে ফাইলগুলি টেনে এনে ফেলে দেওয়ার বিষয়টি গুরুত্বপূর্ণ নয় (যা পরামিতি হয়ে যায়), এর প্রতিটি অংশ (এবং শিশু প্রক্রিয়াগুলি) চলবে আপনার কাঙ্ক্ষিত অগ্রাধিকার

উদাহরণ স্বরূপ:

@echo off
call MyPrio

REM Here comes a set of commands that will run with idle priority.

call MyPrio normal

REM Here may come some interactive part to request information needed to continue.

call MyPrio

REM Back to idle (or put any other priority you prefer).

call MyPrio normal

REM You may want to set the priority to normal at the end just in case you call the batch from a command line.

মন্তব্য

প্রতিটি সম্ভাব্য বিকল্প দিয়ে PrioTest.batপরীক্ষার জন্য আমি একটি ব্যাচ তৈরি করেছি MyPrio.batএবং তাদের আদেশ দিয়েছি যাতে কোনও কলই অগ্রাধিকারটিকে অন্য একটিতে পরিবর্তন করে। আমি একটি সাবরুটিন তৈরি করেছি ( :test1):

1. বর্তমান অগ্রাধিকার পায় এবং এতে সংরক্ষণ করুন myPrioBefore
২.MyPrio পরীক্ষার প্যারামিটার সহ কল করুন ।
3. নতুন অগ্রাধিকার পায় এবং এতে সংরক্ষণ করুন myPrioAfter
4. একটি গোপন শুরু ping -t localhost
5. অগ্রাধিকার এবং PID, পায় pingপ্রক্রিয়া এবং তাদের সংরক্ষণ pingPrioএবং pingPID
6. ছাপে মান myPrioBefore, এর কল MyPrio, myPrioAfterএবং pingPrio। The
. শুরুটি হত্যা করে ping(নিশ্চিত হওয়া যে এটি অন্যটি নয়)।

@echo off

setlocal

set UniqueString=%RANDOM%-%RANDOM%-%RANDOM%-%RANDOM%-%RANDOM%
for /f "usebackq tokens=2 delims==" %%a in (`wmic Process WHERE "name='cmd.exe' AND CommandLine LIKE '%%%UniqueString%%%'" Get ParentProcessID /format:LIST`) do set myPID=%%a
for %%a in (64 16384 32 32768 128 256 idle "below normal" none normal "idle" "normal" "above normal" realtime "high priority" "realtime") do call :test1 %%a
CALL MyPrio normal

endlocal
goto :eof

:test1
for /f "usebackq tokens=2 delims==" %%b in (`wmic Process WHERE "ProcessID='%%myPID%%'" Get Priority /format:LIST`) do set myPrioBefore=%%b
if [%1]==[none] ( call MyPrio ) else ( call MyPrio %1 )
for /f "usebackq tokens=2 delims==" %%b in (`wmic Process WHERE "ProcessID='%%myPID%%'" Get Priority /format:LIST`) do set myPrioAfter=%%b
start "" /b ping -t localhost > nul
for /f "usebackq tokens=2 delims==" %%b in (`wmic Process WHERE "name='ping.exe' AND ParentProcessID='%%myPID%%'" Get Priority /format:LIST`) do set pingPrio=%%b
for /f "usebackq tokens=2 delims==" %%b in (`wmic Process WHERE "name='ping.exe' AND ParentProcessID='%%myPID%%'" Get ProcessID /format:LIST`) do set pingPID=%%b
echo myPrioBefore==%myPrioBefore% / CALL MyPrio %1 / myPrioAfter==%myPrioAfter% / pingPrio==%pingPrio%
taskkill /f /pid %pingPID% > nul
exit /b

এটি পরীক্ষক ব্যাচের আউটপুট:

myPrioBefore==4 / CALL MyPrio 64 / myPrioAfter==4 / pingPrio==4
myPrioBefore==4 / CALL MyPrio 16384 / myPrioAfter==6 / pingPrio==6
myPrioBefore==6 / CALL MyPrio 32 / myPrioAfter==8 / pingPrio==8
myPrioBefore==8 / CALL MyPrio 32768 / myPrioAfter==10 / pingPrio==8
myPrioBefore==10 / CALL MyPrio 128 / myPrioAfter==13 / pingPrio==8
myPrioBefore==13 / CALL MyPrio 256 / myPrioAfter==13 / pingPrio==8
myPrioBefore==13 / CALL MyPrio idle / myPrioAfter==4 / pingPrio==4
myPrioBefore==4 / CALL MyPrio "below normal" / myPrioAfter==6 / pingPrio==6
myPrioBefore==6 / CALL MyPrio none / myPrioAfter==4 / pingPrio==4
myPrioBefore==4 / CALL MyPrio normal / myPrioAfter==8 / pingPrio==8
myPrioBefore==8 / CALL MyPrio "idle" / myPrioAfter==4 / pingPrio==4
myPrioBefore==4 / CALL MyPrio "normal" / myPrioAfter==8 / pingPrio==8
myPrioBefore==8 / CALL MyPrio "above normal" / myPrioAfter==10 / pingPrio==8
myPrioBefore==10 / CALL MyPrio realtime / myPrioAfter==13 / pingPrio==8
myPrioBefore==13 / CALL MyPrio "high priority" / myPrioAfter==13 / pingPrio==8
myPrioBefore==13 / CALL MyPrio "realtime" / myPrioAfter==13 / pingPrio==8

আপনি দেখতে পাচ্ছেন, myPrioAfterকলটিতে অনুরোধটির সাথে মেলে না এবং কখনও কখনও , এর অগ্রাধিকারটি pingপিতামাতার সমান হয় না cmdতাই মানগুলি আরও থাকতে হবে (পঞ্চম লাইনে দেখুন: বর্তমান অগ্রাধিকারটি 10, আপনি অনুরোধ 128, নতুন অগ্রাধিকার 13 এবং শিশু প্রক্রিয়া 8, দুঃখিত?)। এছাড়াও, realtimeমনে হয় এটি কার্যকর হয় না (অ্যাডমিন অধিকারগুলি আমি ধরে নিই)


0

এখানে আমার গ্রহণযোগ্যতা: বর্তমান প্রক্রিয়াটির অগ্রাধিকারটিকে কম করার পরিবর্তে, cmd.exeনিম্ন অগ্রাধিকার সহ একটি নতুন উদাহরণ তৈরি করে ব্যাচ ফাইলটি আবার চালু করুন ; পরিবেশটি (স্বয়ংক্রিয়ভাবে) উত্তরাধিকার সূত্রে প্রাপ্ত হবে এবং, যদি এটি প্রারম্ভের কাছাকাছি হয়ে যায় তবে এটি পরিচালনা করার জন্য (যা বাধা দেয় - পরিবর্তে ব্যবহার করে) বাদে "একই" হিসাবে কাজ করবে । এটি অতিরিক্ত উদাহরণের (এবং সম্পর্কিত ) (কম) ব্যয়ে কোনও অতিরিক্ত নির্ভরতা প্রবর্তন করে না ।Ctrl+cstart /bCtrl+Breakcmd.execonhost.exe

এই স্নিপেটকে কেবল অনুলিপি করুন এবং আটকান:

rem | reduce process priority (uses an additional cmd.exe instance)
if not "%TARGET_LABEL%"=="" goto %TARGET_LABEL%
set TARGET_LABEL=RunLowPriority
start "" /b /belownormal /wait cmd /d /c "%~dpnx0" %*
goto :EOF
:RunLowPriority

কি হচ্ছে:

  • [২ য় দৃষ্টান্ত] পূর্ববর্তী একটি সেটআপ শনাক্ত করা হয়েছে: কাঙ্ক্ষিত স্থানে লাফ দেয় ( RunLowPriority)
  • [প্রথম উদাহরণ] RunLowPriority২ য় দৃষ্টান্তের জন্য জাম্প টার্গেট সেট করে ( )
  • [প্রথম উদাহরণ] ২ য় উদাহরণ শুরু হয়
    • সাধারণ অগ্রাধিকার নীচে ব্যবহার করুন
    • নতুন কনসোলটি শুরু করবেন না এবং ২ য় দফা শেষ হওয়ার জন্য অপেক্ষা করুন
    • "বিস্ময়" (স্পেস, ইত্যাদি) এড়াতে উদ্ধৃতিগুলিতে পুরো পথ ব্যবহার করুন
    • সমস্ত পরামিতি পাস ( %*)
  • [প্রথম উদাহরণ] দ্বিতীয় তম উদাহরণটি শেষ হলে প্রস্থান করে

দুই কম্যান্ড প্রম্প্ট দৃষ্টান্ত ব্যবহারের একটি সমান্তরাল প্রভাব যে Ctrl+Breakপ্রদর্শন দুই ব্যাচ কাজ (ওয়াই / এন) বিনষ্ট? - ইন্টারেক্টিভভাবে স্ক্রিপ্ট চালানোর সময় কোনও সমস্যা নয় (যেমন উইন্ডোজ এক্সপ্লোরার) তবে বিদ্যমান কমান্ড প্রম্পট থেকে চালিত হওয়ার সময় কিছুটা অদ্ভুত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.