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

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

He escrito un script php para comprobar si hay archivos nuevos en una carpeta y, si existen, 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 muevan al servidor lo antes posible. Sin embargo, una vez que el script ya intenta cargar un archivo, no quiero que se ejecute nuevamente, ya que 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 ya se esté ejecutando?

Respuesta1

Suponiendo que simplemente está configurando la tarea en "Repetir" en el sistema de "Tareas programadas" de XP, no es necesaria ninguna otra acción de su parte. 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 aún se está ejecutando, deténgala en este momento" para hacer que el programador de tareas elimine la última instancia antes de iniciar una nueva (aunque parece que probablemente no No quiero eso).

Respuesta2

La forma en que lo hice 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 medianoche siguiente. La ventaja de esto es que debido a que es un script único, no se puede ejecutar una segunda instancia. Supongo que una desventaja podría ser que puedes predecir exactamente con qué frecuencia se ejecuta el script porque esperaría un tiempo determinado 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

J.R.

Respuesta3

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

Respuesta4

La forma habitual es comprobar si hay algún elemento global (a menudo un archivo vacío específico) cuando se inicia la tarea. Si existe, la tarea ya se está ejecutando. Si no, configure el elemento global, haga sus cosas, desactive el elemento global cuando la tarea esté terminada.

Esto tiene problemas si la tarea falla sin desarmar el sistema global. Es posible que desees desactivarlo siempre en la rutina de inicio de la computadora, ya que la tarea no puede ejecutarse si reiniciaste. Es mejor encontrar algo global que desaparezca automáticamente cuando finalice la tarea.

información relacionada