如果同一个任务已经在运行,我怎样才能防止计划的任务运行?

我写了一个php脚本来检查文件夹中是否有新文件,如果有新文件存在,将它们上传到服务器。 这些文件可能相当大。 我想经常运行这个脚本 – 比方说每5分钟一次 – 作为一个计划任务,以便文件尽快移动到服务器。 但是,一旦脚本已经试图上传文件,我不希望它再次运行,因为恐怕第二个实例将覆盖已经上传到服务器的文件。

除非脚本已经在运行,否则如何将脚本作为计划任务来运行?

假设您只是在XP“计划任务”系统中将任务设置为“重复”,则不需要进一步操作。 计划任务如果已经运行,将不会“重复”任务。

如果你想覆盖这个默认值,你可以勾选“如果任务仍在运行,在这个时候停止它”,让任务调度程序在启动一个新的实例之前杀死最后一个实例(尽pipe听起来像你可能不会不要那样)。

我这样做的方法是从batch file中运行任务,每天从午夜开始,一直运行到下一个午夜。 这样做的好处是,因为它是一个单一的脚本,你不能得到第二个实例运行。 我认为一个缺点可能是,你可以准确预测脚本的运行频率,因为每次运行后都会等待一段时间。 无论如何,如果你感兴趣,我的脚本看起来像:

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

在Windows任务计划程序中,有一个checkbox(或多个选项),用于在任务再次启动时任务已经在运行的情况下执行的操作。 您可以将其设置为不启动或并行运行

通常的方法是在任务开始时testing一些全局的东西(通常是一个特定的空文件)。 如果存在,任务已经在运行。 如果不是这样,那么设置全球性的东西,做好自己的事情,在任务完成时解除全局性的东西。

如果任务失败而没有解决全局问题,则会出现问题。 您可能希望在计算机启动例程中始终取消该设置,因为如果重新启动,该任务无法运行。 更好的办法是find一个全球性的东西,当任务结束时会自动消失。