I have a Shell script that needs to run in a loop, and perform a series of commands, and when it's finished repeat, hence the loop. Between each command there is a sleep command for a few minutes. The "job" should never terminate. I can have the script start a boot time, but it needs to continue where it left off in the sequence for the commands when the system is rebooted.
How can I best accomplished this? Should I create a MySQL table of the queue of commands, and have it delete each row after each time it successfully executes it? Then when it completes the loops it would re-populate the queue table and start from the top.
It seems like I'm missing something to make this more simple. Thanks in advance for your helpful insight!
MySQL sounds like a pretty complex solution for this case. In general I would think about some sort of filesystem based markers. You could keep the current state of execution in one or more files e. g. in
/var/run
and make your script check for these files when it starts up.When you complete one step, you rename the file to reflect the next step that needs to be done and so on.
At the end, rename it or remove it so that the next time the script runs, it will start a new cycle.
You may want to rewrite your code so that it looks like this:
So you would be aware of what has been done by testing the value of
step
.Then, you may want to set a
trap
before thewhile
loop is executed, so that, on exit, the value ofstep
is written to a log file:Then, all you need to do is to
source
the log file at the beginning of the script, and the last one will continue its job where it has been stopped.I think you can use a cron job for this. A cron job can run each minute and with a "lock file" strategy you can run the script only if the lock file is not present hence when the previous running script was ended.