我有一个需要在循环中运行的Shell脚本,并执行一系列命令,当它完成重复时,因此循环。在每个命令之间有一个睡眠命令几分钟。 "工作"永远不应该终止。我可以让脚本启动一个启动时间,但是当系统重新启动时,它需要在命令序列中停止的地方继续。
我怎样才能做到最好?我应该创建一个命令队列的MySQL表,并在每次成功执行后删除每一行吗?然后,当它完成循环时,它将重新填充队列表并从顶部开始。
似乎我错过了一些让这更简单的东西。提前感谢您的有益见解!
答案 0 :(得分:1)
您可能需要重写代码,使其如下所示:
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
因此,您将了解通过测试step
的价值所做的工作。
然后,您可能希望在执行trap
循环之前设置while
,以便在退出时将step
的值写入日志文件:
trap "echo step=$step > log_file" EXIT
然后,您需要做的就是在脚本开头的source
日志文件,最后一个文件将继续其停止的作业。
答案 1 :(得分:0)
对于这种情况,MySQL听起来像是一个非常复杂的解决方案。一般来说,我会考虑某种基于文件系统的标记。您可以将当前执行状态保存在一个或多个文件中e。 G。在/var/run
中,让您的脚本在启动时检查这些文件。
完成一步后,重命名文件以反映需要完成的下一步等等。
最后,重命名或删除它,以便下次脚本运行时,它将开始一个新的循环。
答案 2 :(得分:0)
我认为您可以使用cron作业。一个cron作业可以每分钟运行一次,并且使用“锁定文件”策略,只有当锁定文件不存在时才能运行脚本,因此当前一个运行的脚本结束时。