如果同一任务已在运行,我该如何阻止运行计划任务?

如果同一任务已在运行,我该如何阻止运行计划任务?

我编写了一个 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

通常的做法是在任务启动时测试某个全局变量(通常是特定的空文件)。如果存在,则表示任务已在运行。如果不存在,则设置全局变量,然后执行任务,任务完成后取消设置全局变量。

如果任务失败而没有取消设置全局变量,则会出现问题。您可能希望始终在计算机启动例程中取消设置它,因为如果您重新启动,任务将无法运行。更好的方法是找到一个在任务结束时自动消失的全局变量。

相关内容