![¿Cómo puedo evitar que se ejecute una tarea programada si ya se está ejecutando la misma tarea?](https://rvso.com/image/488047/%C2%BFC%C3%B3mo%20puedo%20evitar%20que%20se%20ejecute%20una%20tarea%20programada%20si%20ya%20se%20est%C3%A1%20ejecutando%20la%20misma%20tarea%3F.png)
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.