同じタスクがすでに実行されている場合、スケジュールされたタスクが実行されないようにするにはどうすればよいですか?

同じタスクがすでに実行されている場合、スケジュールされたタスクが実行されないようにするにはどうすればよいですか?

フォルダーに新しいファイルがあるかどうかを確認し、新しいファイルがある場合はサーバーにアップロードする PHP スクリプトを作成しました。これらのファイルは非常に大きくなる可能性があります。このスクリプトをスケジュールされたタスクとして頻繁に (たとえば 5 分ごとに) 実行して、ファイルができるだけ早くサーバーに移動されるようにしたいと考えています。ただし、スクリプトがファイルのアップロードを試行した後は、2 回目の実行によってサーバーにすでにアップロードされているファイルが上書きされる恐れがあるため、再度実行したくありません。

スクリプトがすでに実行されていない場合、スクリプトをスケジュールされたタスクとして実行するにはどうすればよいですか?

答え1

XP の「スケジュールされたタスク」システムでタスクを「繰り返し」に設定するだけであれば、それ以上の操作は必要ありません。スケジュールされたタスクは、すでに実行中のタスクを「繰り返し」ません。

このデフォルトを上書きしたい場合は、「タスクがまだ実行中の場合は、この時点で停止する」ボックスをオンにして、タスク スケジューラが新しいインスタンスを開始する前に最後のインスタンスを強制終了するようにすることができます (ただし、おそらくこれは望ましくないと思われます)。

答え2

私がこれを実行した方法は、1 日に 1 回、真夜中過ぎに開始して次の真夜中まで実行するバッチ ファイルからタスクを実行することです。この方法の利点は、スクリプトが 1 つしかないため、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

通常の方法は、タスクの開始時に何らかのグローバルなもの (多くの場合、特定の空のファイル) をテストすることです。存在する場合、タスクはすでに実行されています。存在しない場合は、グローバルなものを設定し、必要な作業を行い、タスクが完了したらグローバルなものを設定解除します。

グローバルなものを設定解除せずにタスクが失敗すると、問題が発生します。再起動するとタスクを実行できなくなるため、コンピューターの起動ルーチンで常にグローバルなものを設定解除することをお勧めします。タスクが終了したときに自動的に消えるグローバルなものを見つける方がよいでしょう。

関連情報