web-dev-qa-db-ja.com

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

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

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

11
Oren Hizkiya

XP "Scheduled Tasks"システムでタスクを "Repeat"に設定しているだけであると仮定すると、それ以上のアクションは必要ありません。スケジュールされたタスクは、タスクを "Repeat"しませんすでに実行されています。

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

21
Evan Anderson

私がこれを行った方法は、真夜中の直後に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

2
John Rennie

Windowsタスクスケジューラには、タスクの再開時にタスクがすでに実行されている場合の処理​​のチェックボックス(またはオプション)があります。起動または並列実行しないように設定できます

1
Kevin Kuphal

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

グローバルなものの設定を解除せずにタスクが失敗した場合、これには問題があります。再起動するとタスクが実行されない可能性があるため、コンピュータの起動ルーチンで常に設定を解除することをお勧めします。タスクが終了すると自動的に消えるグローバルなものを見つけるのが良いでしょう。

0
D-Coder