I have written a php script to check if there are any new files in a folder and, if any new files exist, upload them to a server. These files can be quite large. I want to run this script frequently-let's say every 5 min-as a scheduled task so that the files get moved to the server as soon as possible. However, once the script is already attempting to upload a file, I do not want it to be run again, as I am afraid the second instance will overwrite the file that is already being uploaded to the server.
How can I run the script as a scheduled task unless the script is already running?
Assuming you're just setting the task to "Repeat" in the XP "Scheduled Tasks" system, no further action on your part is needed. Scheduled Tasks won't "Repeat" a task if it's already running.
If you want to override that default, you can check the box "If the task is still running, stop it at this time" to cause the task scheduler to kill the last instance before starting a new one (though it sounds like you probably don't want that).
The way I have done this is to run the task from a batch file that starts once a day shortly after midnight and runs until next midnight. The advantag of this is that because it's a single script you cannot get a second instance running. I suppose a disadvantage might be that you can predict exactly how often the script runs because it would wait a set time after each run. Anyhow if you're interested my script looks like:
JR
In the windows task scheduler there is a checkbox (or options) for what to do if the task is already running when the task starts again. You can set it not to start or run in parallel
The usual way is to test for some global thingy (often a specific empty file) when the task starts. If it exists, the task is already running. If not, set the global thingy, do your stuff, unset the global thingy when the task is done.
This has problems if the task fails without unsetting the global thingy. You may want to always unset it in the computer startup routine since the task can't be running if you've restarted. Better is to find a global thingy that goes away automatically when the task ends.