আমি কিভাবে একই ব্যাচ ফাইলটি চালানোর জন্য দুই বার একই ফাইল চালাতে বাধা দিতে পারি?


4

একটি ব্যাচ ফাইল ইতিমধ্যে চলমান বা না যদি আমি সনাক্ত করতে হবে।

ব্যাচ আমি কেবল লুপ এবং বারবার কিছু কাজ করতে। কখনও কখনও লুপ সম্পূর্ণ করা যাবে না। আমি একটি নির্দিষ্ট সময়ে ব্যাচ ফাইল চালানো। যখন এটি সঞ্চালিত হয়, এটি একটি পূর্ববর্তী ঘটনা বিদ্যমান এবং স্বাস্থ্যকর কিনা তা পরীক্ষা করা উচিত। এটি অস্তিত্ব না থাকলে এটি একটি নতুন উদাহরণ শুরু করা উচিত। যদি উপস্থিত উদাহরণটি সুস্থ / পুরানো না হয় তবে নতুন দৃষ্টান্তটি পুরোনো প্রক্রিয়াটিকে বাতিল / বাতিল করতে হবে।

কয়েকটি তত্ত্ব:

  1. আমি কিভাবে একটি ব্যাচ ফাইলে একটি পূর্ববর্তী উদাহরণ সনাক্ত করতে পারি? আমি জিনিস মত একটি আইডি দিতে পারি?
  2. ব্যাচটি হিলটি বলে আমি একটি পালস পদ্ধতি ব্যবহার করতে পারি; অর্থাৎ, একটি বিশ্বব্যাপী পরিবর্তনশীল, একটি নতুন তৈরি ডামি ফাইল, একটি ডামি ফাইলের টাইমস্ট্যাম্প ইত্যাদি।
  3. যদি শেষ প্রান্তের মেয়াদ শেষ হয়ে যায় তবে আমি একটি "টাইমআউট" সনাক্ত করতে পারি, তারপর একটি নতুন উদাহরণের অনুমতি দিন ...

হ্যাঁ, আমি তাদের একটি ব্যাচ ফাইলে চাই - উইন্ডোজ অ্যাপ্লিকেশনের পরিবর্তে - আমি মনে করি এটি একটি ব্যাচ-ফাইল আসক্তির জন্য এত কঠিন নয় এবং এই প্রশ্নটিকে চ্যালেঞ্জ হিসাবে গ্রহণ করে!


আপনি এখানে আমার উত্তর চেক করেছেন: superuser.com/questions/362164/...
stijn

হ্যা ধন্যবাদ. আমি চলমান ব্যাচ স্বীকৃতি চেয়ে অনেক বেশি প্রয়োজন; অর্থাত। কিভাবে একাধিক দৃষ্টান্ত সম্পর্কে? আমি কি তাদের নাম দিতে পারি? পৃথকভাবে তাদের হত্যা করতে? আমি নিজে ম্যানেজার থেকে এটি করতে চাই না।
Nime Cloud

আপনি কি বোঝাতে চান তা নিশ্চিত নন - আপনার প্রশ্নটি একক দৃষ্টান্তের অনুমতি সম্পর্কে। কিন্তু এখন আপনি একাধিক দৃষ্টান্ত সম্পর্কে জিজ্ঞাসা করছেন? তবুও তাদের হত্যা করা টাস্ক্কিল বা পস্কিল ব্যবহার করে করা যেতে পারে
stijn

একক উদাহরণ # 1: monitor.bat domain1.com একক উদাহরণ # 2: monitor.bat domain2.com
Nime Cloud

এটি কেবল ব্যাচের ফাইলের একটি উদাহরণ নয় .. আপনি যদি শিরোনাম সেট করেন তবে আপনি এখনও শিরোনাম কৌশল ব্যবহার করতে পারেন mybatch domain1.com mybatch domeain2.com ইত্যাদি। অথবা পাঠ্য ফাইলগুলিতে অবলম্বন করুন যেখানে আপনি দীর্ঘ তালিকাতে ভালগুলির তালিকা রাখেন।
stijn

উত্তর:


6

এটি একটি ব্যাচ ফাইলের দৃষ্টিকোণ থেকে বরং কঠিন, প্রধানত প্রসেস জুড়ে ইনস্ট্যান্স সনাক্ত করার জন্য একটি ব্যাচফিলের জন্য কোনও নিশ্চিত পদ্ধতি নেই।

IMO, আমার মনে হয় আপনি ভুল টুল ব্যবহার করছেন। যদিও, হ্যাঁ, এটি একটি চ্যালেঞ্জ, আরো গুরুত্বপূর্ণ উদ্বেগ "এটি কাজ করে?"

আমি একটি নির্ধারিত সময়ের মধ্যে ব্যাচ ফাইল চালানো।

এটি আমাকে বলে যে আপনি সময় নির্ধারণকারী প্রোগ্রামের মত একটি সময়সূচি প্রোগ্রাম ব্যবহার করা উচিত। কার্য নির্ধারণকারী গ্যারান্টি দেয় যে আপনার ফাইলের কেবলমাত্র একটি উদাহরণ রয়েছে, এমনকি এটি অন্য ব্যবহারকারীতে চলছে।

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

ভিস্তা এবং আপ জন্য: http://technet.microsoft.com/en-us/library/cc748993.aspx#BKMK_cmd
এক্সপি এবং আপ জন্য: http://technet.microsoft.com/en-us/library/bb490996.aspx

চ্যালেঞ্জিং পদ্ধতি রাষ্ট্র তৈরি করা হয়।

  1. আপনার ব্যাচ ফাইল নির্বাহ প্রবেশ করে
  2. আপনার ব্যাচ ফাইল loops
  3. আপনার ব্যাচ ফাইল শেষ

আপনি% alusersprofile% তে একটি নির্বিচারে ফাইল তৈরি করতে পারেন >>Startmybatchfile.txt echo 1 প্রতিটি রাষ্ট্রের জন্য, তাহলে এটি বিদ্যমান কিনা তা পরীক্ষা করুন। এটা কষ্ট শুটিং সাহায্য করবে। কিন্তু শেষে ফাইল মুছে ফেলবেন না। শুধু শেষ রাষ্ট্র পরিবর্তন। আপনার ব্যাচ ফাইল আছে যে ভাবে এটি নির্ধারণমূলক হয় প্রকৃতপক্ষে সমাপ্ত এবং আর চলমান।

এটি চালানোর জন্য অ্যাডমিন বিশেষাধিকার প্রয়োজন হিসাবে আমি একটি বৈশ্বিক পরিবর্তনশীল ব্যবহার করবে না।

আপনি% temp% ভেরিয়েবল ব্যবহার করতে পারেন তবে ব্যবহারকারীর থেকে ব্যবহারকারীর পরিবর্তন। আমি আপনি একটি একক লগইন ব্যবহারকারী মেশিন যদি একটি উদ্বেগ না অনুমান।


যদি সমস্ত ঘটনা শেষ হয় তবে টিএস একটি নতুন উদাহরণ শুরু করে। তাই আমি টিএস ব্যবহার করি। প্লাস যখন ওএস শুরু হয়, টিএস প্রথম উদাহরণ তৈরি করে, ইত্যাদি।
Nime Cloud

5

এটি আমার সর্বশেষ এবং সবচেয়ে বিশ্বস্ত স্ক্রিপ্ট:

:init
set "started="
2>nul (
 9>"%~f0.lock" (
  set "started=1"
  call :start
 )
)
@if defined started (
    del "%~f0.lock" >nul 2>nul
) else (
    echo Process aborted: "%~f0" is already running
    @ping localhost > nul
)

exit /b




:start
cd /d %~dp0
:: REST OF THE SCRIPT

এই স্ক্রিপ্ট কি ঘটছে? আমরা একাধিক ব্যাচ স্ক্রিপ্ট এটি ব্যবহার করতে পারেন?
Angelina

2

আমি এটি করার জন্য সবচেয়ে ভাল উপায় একটি ব্যাচ স্ক্রিপ্ট শিরোনাম সেট করা হয়।

সেখানে থেকে আপনি শিরোনাম নাম দ্বারা চলমান প্রসেস গণনা প্রশ্নের টাস্ক তালিকা ব্যবহার করতে পারেন। প্রক্রিয়া_count = 2 এর নিচে যে কোনও নীচের কোড স্নিপেট মানে প্রক্রিয়াটি চলছে না, 3 এর অর্থ হল 1 টি ইনস্ট্যান্স চলছে এবং 3 এর উপরে 3 টির বেশি প্রক্রিয়া চলছে।

হ্যাকিশ, কিন্তু ব্যাচ এটা কি।

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

হ্যাঁ আমি টেক্সট ফাইল থেকে বাদ দিতে পারেন, কিন্তু আমি ক্যাশ দুর্নীতি সম্পর্কে চিন্তিত।

@REM ########################
:COUNT_PROCESS_INSTANCES
@REM @@@@@@@@@@@@@@@@@@@@@@@@

SET /A PROCESS_COUNTER=0


@REM No way to inject a counter into this for statement.
FOR /F "DELIMS=" %%A in ('tasklist /FI "WINDOWTITLE EQ %USERNAME%:  %PROCESS_NAME_TO_COUNT%*"') do (CALL :SUB_INCRIMENT_PROCESS_COUNTER)

@REM If one instance is running, or no instances, that's fine.  If more than one instance is running, time to exterminate.

@ECHO PROCESS COUNTER IS: "%PROCESS_COUNTER%"
SET PROCESS_NAME_TO_COUNT=NULL

GOTO :EOF

:SUB_INCRIMENT_PROCESS_COUNTER
SET /A PROCESS_COUNTER=%PROCESS_COUNTER%+1
GOTO :EOF

@REM @@@@@@@@@@@@@@@@@@@@@@@@
@REM ########################

এছাড়াও, আগ্রহী কেউ জন্য; বর্তমানে নির্বাহ প্রক্রিয়াটির PID কিভাবে খুঁজে পাওয়া যায়। এখন যদি আপনি একটি সাব-স্ক্রিপ্টে একটি পরিবর্তনশীল পাস করেন তবে আপনি পাঠ্য নথির মাধ্যমে শৃঙ্খলে ব্যাক আপ করতে পারেন (আমার মনে হয় এটি করার অন্য উপায়ও রয়েছে তবে এটি আমাকে পালিয়েছে)।

@REM @@@@@@@@@@@@@@@@@@@@@@@@
:FIND_SELF_PID
@REM ########################
@REM Leaving this here for later if needed.  This was a byproduct of a bad approach.

FOR /F "TOKENS=1,2,*" %%A in ('tasklist /FI "WINDOWTITLE EQ %USERNAME%:  %CURRENT_TITLE%"') do (SET SELF_PID=%%B)

echo %self_pid%

GOTO :EOF
@REM @@@@@@@@@@@@@@@@@@@@@@@@
@REM ########################

1

প্রশ্নটির প্রথম অংশ সম্পর্কে, যদি আপনি কোনও প্রক্রিয়া খুঁজে পেতে tasklist.exe ব্যবহার করেন তবে মনে রাখবেন যে 'উইন্ডোটি শিরোনাম' ফিল্টার শুধুমাত্র একটি পৃথক প্রক্রিয়াতে উইন্ডোজের জন্য কাজ করবে। সুতরাং আপনি যদি একটি ব্যাচ ফাইলটি আইটিএসএলএফ সনাক্ত করতে চান (অর্থাত ইতিমধ্যে চলমান উদাহরণ আছে কিনা তা পরীক্ষা করুন) তবে আপনাকে এর পরিবর্তে 'কল্পনা' ব্যবহার করতে হবে:

tasklist /V /NH /FI "imagename eq cmd.exe"| find /I /C "UNIQUETITLE" > nul

এছাড়াও ফিল্টার ছাড়াই প্রক্রিয়াটি উইন্ডোজের পরবর্তী সংস্করণগুলিতে খুব বেশি সময় নিতে পারে। এখানে একটি ব্যাচ ফাইলের একটি উদাহরণ যা কেবল একবারে একটি উদাহরণ হিসাবে চালানো যেতে পারে:

@echo off
:: Test with tasklist.exe to make sure the process is not already running:
:: Window title must be unique.
set loop_batch_title=Only this instance is allowed to run.
:: Run tasklist in verbose mode (which returns window titles) and search for the window title of this batch file:
tasklist /V /NH /FI "imagename eq cmd.exe"| find /I /C "%loop_batch_title%" > nul
:: If the window title is found then the errorlevel variable will be 0, which means the process is already running:
if %errorlevel%==0 goto AlreadyRunning
:: If the process isn't already running then the window title can be set:
title %loop_batch_title%

::Put your program loop here
:Loop
echo This is a loop.
ping -n 3 127.0.0.1>nul
goto Loop

:AlreadyRunning
echo.
echo Process already running.
endlocal

0

আমি কেবলমাত্র ব্যাচ ফাইলটি শেষ করেছি যা একটিকে নিজেই পর্যবেক্ষণ করে নিশ্চিত করে - ব্যাচ ফাইল- এবং কাজের ফাইল -facerecog.exe- মসৃণভাবে চলছে। আমি test test tool হিসাবে hello.exe ব্যবহার করেছি, আপনি নিজের প্রতিস্থাপন করতে পারেন; অর্থাত। ping.exe ইত্যাদি। যখন এটি কোনও প্যারামিটার ছাড়াই শুরু হয় তখন এটি অন্য একটি উদাহরণকে প্রস্থান করে এবং প্রস্থান করে, যাতে আপনি এটি নির্দিষ্ট সময়সীমার মধ্যে নির্ধারিত কার্য হিসাবে চালাতে পারেন। আমি এটা উন্নত সরঞ্জাম ব্যবহার করতে চান না এমন কেউ সাহায্য করে আশা করি।

    @goto code

    :comments
    @REM RunMagick for FaceRecog
    @REM Runs FaceRecog forever
    @REM Author Emin Akbulut eminakbulut@gmail.com
    @REM 29/11/2011
    @REM This code is freeware


    :code
    @C:
    @CD C:\NET\FaceRecog

    :settings
    set jobexe=FaceRecog.exe
    set remotehost=192.168.35.211
    set remoteport=1333
    @REM Timeout for response of the batch, in seconds
    set /a timeout=120
    set batchtitle=Monitoring FaceRecog...


    :requirements
    @if NOT exist "stopwatch.exe" (
    @echo. stopwatch.exe is missing!
    @ping localhost > nul
    start http://www.jfitz.com/dos/stopwatch10.zip
    goto end
    ) 




    :menu
    @if "%1" == "/monitor" goto monitor
    @if "%1" == "/stop" goto request-stop
    @if "%1" == "/force-stop" goto stop


    :batch-instance-check 
    tasklist /v /fi "IMAGENAME eq cmd.exe" | find /I /c "%batchtitle%"
    @if "%ERRORLEVEL%" == "0" goto batch-instance-found
    goto start

    :batch-instance-found
    @REM Check the previous instance is healthy/responsive or not
    stopwatch stop < pulse.log > elapsed.log
    set /a elapsed=999
    for /F %%a in ('type elapsed.log') do set /a elapsed=%%a
    if %elapsed% gtr %timeout% (
    taskkill /F /FI "WINDOWTITLE eq %batchtitle%*"
    goto start
    ) else (
    @echo Already running...
    @ping localhost > nul
    goto end
    )

    del elapsed.log



    @goto monitor



    :run-job
    @REM Test FaceRecog process
    tasklist | Find "FaceRecog.exe"
    @If Not ErrorLevel 1 Goto monitor

    taskkill /f /im:conime.exe
    @PING 1.1.1.1 -n 1 -w 1000 >NUL
    start FaceRecog.exe
    @REM Take a breathe
    @PING 1.1.1.1 -n 1 -w 1000 >NUL
    @goto run-job

    :start
    @REM Fire another instance with /monitor command and exit
    start "%batchtitle%" /low /I %0 /monitor
    goto end

    :stop
    @REM Stop the job
    taskkill /F /IM:%jobexe%
    @REM Stop the batch
    taskkill /F /FI "WINDOWSTITLE eq %batchtitle%*"
    del stop.log > nul
    title Done
    goto end

    :request-stop
    @REM Ask programs to quit
    @REM %jobexe% /quit
    @REM Take a breathe
    @ping localhost > nul
    stopwatch start > stop.log
    goto end

    :monitor
    stopwatch start > pulse.log
    @REM Test /stop requested
    @if exist stop.log goto stop
    @REM Test FaceRecog process
    tasklist | Find "%jobexe%"
    @If Not ErrorLevel 0 Goto run-job

    :shorttest
    @Echo Shorttest...
    hello.exe %remotehost% %remoteport% | Find "Version" 
    @If Not ErrorLevel 1 Goto job-ok

    :crashcheck
    @REM No response, crashed?
    tasklist | Find "WerFault.exe"
    @If ErrorLevel 1 Goto longcheck
    taskkill /F /IM:WerFault.exe
    @goto shorttest

    :longcheck
    @Echo Longtest...
    @REM Last check, maybe FaceRecog was busy
    hello.exe %remotehost% %remoteport% | Find "Version" 
    @If Not ErrorLevel 1 Goto job-ok

    :nonresponsive
    @REM Kill non-responsive FaceRecog process and wait for a while to auto-revive
    taskkill /F /IM:%jobexe%



    :job-ok
    @echo OK
    @REM 10 seconds to wait then loop again
    @PING 1.1.1.1 -n 1 -w 10000 >NUL
    @goto monitor


    :end

ধন্যবাদ stijn তার মহান মন্তব্যের জন্য। ধন্যবাদ surfasb ইতিমধ্যে চলমান যে নির্ধারিত কাজ সম্পর্কে তার সতর্কবার্তা জন্য।

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