如果相同任務已在運行,如何阻止排程任務運行?

如果相同任務已在運行,如何阻止排程任務運行?

我編寫了一個 php 腳本來檢查資料夾中是否有任何新文件,如果存在任何新文件,則將它們上傳到伺服器。這些文件可能非常大。我想經常運行這個腳本(假設每 5 分鐘一次)作為計劃任務,以便檔案盡快移動到伺服器。但是,一旦腳本已經嘗試上傳文件,我不希望再次運行它,因為我擔心第二個實例會覆蓋已經上傳到伺服器的文件。

除非腳本已經在運行,否則如何將腳本作為計劃任務運行?

答案1

假設您只是在 XP“排程任務”系統中將任務設為“重複”,則無需執行任何進一步操作。如果任務已經在運行,則排程任務不會「重複」該任務。

如果您想要覆寫該預設值,您可以選取「如果任務仍在運行,此時停止它」框,以使任務規劃程式在啟動新任務之前殺死最後一個執行個體(儘管聽起來您可能不會這樣做)不想那樣)。

答案2

我這樣做的方法是從批次檔運行該任務,該文件每天在午夜後不久啟動一次,一直運行到下一個午夜。這樣做的優點是,因為它是單一腳本,所以您無法執行第二個實例。我認為一個缺點可能是您可以準確預測腳本運行的頻率,因為它會在每次運行後等待設定的時間。無論如何,如果您有興趣,我的腳本如下所示:

rem *** Get the day number. When the day number changes that signals
rem *** the script to exit.

for /f "tokens=1" %%i in ('date /t') do set THEDATE=%%i
set THEDAY=%THEDATE:~0,2%

rem *** Open the log file

echo Starting Whatever >%LOGFILE%
date /t >>%LOGFILE%
echo . >>%LOGFILE%

rem *** Start the monitoring loop

:start

rem *** Run your script

rem Run the script here

rem *** Pause for 300 seconds

sleep 300

rem *** Check the day number. If it is still the same loop back to the
rem *** start of the monitoring loop.

for /f "tokens=1" %%i in ('date /t') do set THEDATE=%%i
if %THEDATE:~0,2% == %THEDAY% goto start

JR

答案3

在 Windows 工作排程程式中,有一個複選框(或選項),用於指示當任務再次啟動時任務已經在執行時要執行的操作。您可以將其設定為不啟動或並行運行

答案4

通常的方法是在任務啟動時測試一些全局事物(通常是特定的空文件)。如果存在,則任務已在運行。如果沒有,設定全域事物,做你的事情,任務完成後取消設定全域事物。

如果任務在未取消設定全域事物的情況下失敗,則會出現問題。您可能希望始終在電腦啟動例程中取消設定它,因為如果您重新啟動,該任務將無法運行。更好的是找到一個全局的東西,當任務結束時它會自動消失。

相關內容