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