我已经编写了一个php脚本来检查文件夹中是否有任何新文件,如果存在任何新文件,请将它们上传到服务器。这些文件可能很大。我想经常运行此脚本(假设每5分钟运行一次)作为计划任务,以便将文件尽快移至服务器。但是,一旦脚本已经尝试上载文件,我就不想再次运行它,因为恐怕第二个实例将覆盖已经上载到服务器的文件。
除非脚本已在运行,否则如何将其作为计划任务运行?
我已经编写了一个php脚本来检查文件夹中是否有任何新文件,如果存在任何新文件,请将它们上传到服务器。这些文件可能很大。我想经常运行此脚本(假设每5分钟运行一次)作为计划任务,以便将文件尽快移至服务器。但是,一旦脚本已经尝试上载文件,我就不想再次运行它,因为恐怕第二个实例将覆盖已经上载到服务器的文件。
除非脚本已在运行,否则如何将其作为计划任务运行?
Answers:
假设您只是在XP“计划任务”系统中将任务设置为“重复”,则您不需要采取任何进一步的措施。如果计划任务已在运行,则它不会“重复”该任务。
如果要覆盖该默认值,则可以选中“如果任务仍在运行,请在此时停止它”框,以使任务计划程序在启动新实例之前终止最后一个实例(尽管听起来您可能不这样做)不想那样)。
我这样做的方法是从一个批处理文件运行该任务,该文件每天从午夜后一天开始一次,一直运行到下一个午夜。这样做的优点是,因为它是一个脚本,所以您无法运行第二个实例。我想一个缺点可能是您可以准确预测脚本的运行频率,因为它会在每次运行后等待指定的时间。无论如何,如果您有兴趣,我的脚本如下所示:
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
通常的方法是在任务启动时测试一些全局的东西(通常是特定的空文件)。如果存在,则该任务已经在运行。如果没有,则设置全局任务,执行任务,完成任务后取消全局任务。
如果任务失败而没有取消设置全局对象,则会出现问题。您可能要始终在计算机启动例程中取消设置它,因为如果重新启动该任务将无法运行。更好的方法是找到一个在任务结束时自动消失的全局对象。