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 co
You may want to rewrite your code so that it looks like this:
while: ; do
case $step in
0) command_1 && ((step++)) ;;
1) command_2 && ((step++)) ;;
...
9) command_9 && step=0 ;;
*) echo "ERROR" >&2 ; exit 1 ;;
esac
done
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 the while
loop is executed, so that, on exit, the value of step
is written to a log file:
trap "echo step=$step > log_file" EXIT
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.
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.