1

我有一个需要循环运行的 Shell 脚本,并执行一系列命令,完成后重复,因此循环。在每个命令之间有一个睡眠命令,持续几分钟。“工作”永远不应该终止。我可以让脚本启动启动时间,但它需要在系统重新启动时按照命令顺序从中断的地方继续。

我怎样才能最好地做到这一点?我是否应该创建命令队列的 MySQL 表,并在每次成功执行后删除每一行?然后,当它完成循环时,它将重新填充队列表并从顶部开始。

似乎我错过了一些让这更简单的东西。提前感谢您的有用见解!

4

3 回答 3

2

您可能想要重写您的代码,使其看起来像这样:

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在脚本开头的日志文件中,最后一个将继续其已停止的工作。

于 2013-01-26T03:38:21.397 回答
0

对于这种情况,MySQL 听起来像是一个非常复杂的解决方案。一般来说,我会考虑某种基于文件系统的标记。您可以将当前执行状态保存在一个或多个文件中,例如 in/var/run并让您的脚本在启动时检查这些文件。

完成一个步骤后,您可以重命名文件以反映需要完成的下一步,依此类推。

最后,重命名或删除它,以便下次脚本运行时,它将开始一个新的循环。

于 2013-01-25T12:06:52.750 回答
0

我认为您可以为此使用 cron 作业。cron 作业可以每分钟运行一次,并且使用“锁定文件”策略,只有当锁定文件不存在时,您才能运行脚本,因此在前一个运行脚本结束时。

于 2013-01-25T12:08:57.807 回答