¿Cómo puedo evitar que se ejecute una tarea programada si ya se está ejecutando la misma tarea?

11

He escrito un script php para verificar si hay archivos nuevos en una carpeta y, si existen archivos nuevos, subirlos a un servidor. Estos archivos pueden ser bastante grandes. Quiero ejecutar este script con frecuencia, digamos cada 5 minutos, como una tarea programada para que los archivos se trasladen al servidor lo antes posible. Sin embargo, una vez que el script ya está intentando cargar un archivo, no quiero que se ejecute nuevamente, ya que me temo que la segunda instancia sobrescribirá el archivo que ya se está cargando en el servidor.

¿Cómo puedo ejecutar el script como una tarea programada a menos que el script ya se esté ejecutando?

Oren Hizkiya
fuente

Respuestas:

21

Suponiendo que solo está configurando la tarea para "Repetir" en el sistema "Tareas programadas" de XP, no es necesario que realice ninguna otra acción. Las tareas programadas no "repetirán" una tarea si ya se está ejecutando.

Si desea anular ese valor predeterminado, puede marcar la casilla "Si la tarea todavía se está ejecutando, deténgala en este momento" para que el programador de tareas elimine la última instancia antes de comenzar una nueva (aunque parece que probablemente no lo haga) No quiero eso).

Evan Anderson
fuente
2

La forma en que hice esto es ejecutar la tarea desde un archivo por lotes que comienza una vez al día, poco después de la medianoche y se ejecuta hasta la próxima medianoche. La ventaja de esto es que debido a que es un script único, no puede ejecutar una segunda instancia. Supongo que una desventaja podría ser que puede predecir exactamente con qué frecuencia se ejecuta el script porque esperaría un tiempo establecido después de cada ejecución. De todos modos, si estás interesado, mi script se ve así:

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

John Rennie
fuente
1

En el programador de tareas de Windows hay una casilla de verificación (u opciones) para saber qué hacer si la tarea ya se está ejecutando cuando la tarea se inicia nuevamente. Puede configurarlo para que no se inicie o se ejecute en paralelo

Kevin Kuphal
fuente
1
¿Dónde está esa configuración en el programador de tareas de XP? No encuentro ninguna forma de hacer que el programador de XP ejecute la misma tarea varias veces en paralelo.
Evan Anderson el
Vista. Noté la etiqueta windows-xp después de ingresar mi respuesta.
Kevin Kuphal el
0

La forma habitual es probar algo global (a menudo un archivo vacío específico) cuando comienza la tarea. Si existe, la tarea ya se está ejecutando. De lo contrario, configure la cosa global, haga sus cosas, desarme la cosa global cuando la tarea esté terminada.

Esto tiene problemas si la tarea falla sin desarmar la cosa global. Es posible que desee desarmarlo siempre en la rutina de inicio de la computadora ya que la tarea no se puede ejecutar si ha reiniciado. Lo mejor es encontrar una cosa global que desaparezca automáticamente cuando finalice la tarea.


fuente