我有一个脚本可以执行复杂的关闭和恢复过程。它执行了一些长时间运行的命令。有的需要十分钟左右,有的则更快。
是否有某种软件可以让我将所有这些命令放入一个文件中并通过检查点执行它们。例如,它将允许我逐个执行它们并记住哪一个是最后执行的,或者只是运行它们全部,如果其中一个中断,我将能够从该点开始重试。
答案1
执行每个长时间运行的命令后,您需要记住它已被执行。记住发生过的事情的方法是将信息存储在文件中。
如果这些命令之一的作用是创建一个文件,那么您可以测试该文件是否存在。有几点需要注意:
- 如果该命令创建一个输出文件并分几个阶段填充它,并且在中间失败,那么您最终将得到一个部分文件。补救措施是让命令写入临时文件,并在命令成功完成后将临时文件重命名为最终名称。
- 如果输出文件在命令运行之前已经存在,则需要一种方法来判断输出文件是否是最新的。这通常可以通过比较输入文件和输出文件的修改时间来解决:如果输出文件比输入文件新,则表明它已重新生成。
这一切都是基础工作构建自动化工具。您可以使用传统的工具,制作。它是围绕“如果文件 B 是从文件 A 构建的,并且 A 比 B 新或者 B 不存在,则运行命令从 A 生成 B”的概念构建的。其语法是
B: A
command-to-generate-B-from-A
其中第二行以制表符开头,而不是空格。
如果该命令未自动创建其输出文件,则将其写入临时文件:
B: A
mycommand <A >B.tmp
mv B.tmp B
请注意,如果mycommand
失败,make 将不会执行第二个命令,因此B
不会创建。
要创建 B,请运行命令make B
。如果 B 已经存在并且比 A 新,则 make 将不会mycommand
再次运行。
自动制定连锁规则。如果您有一条从 A 构建 B 的规则和一条从 B 构建 C 的规则,并且只有 A 存在,则make C
自动构建 B,然后构建 C。
如果没有文件显示该命令已运行,您可以创建一个空文件以便记住。
command1.timestamp:
command1
touch command1.timestamp
command2.timestamp:
command2
touch command2.timestamp
如果已经存在,则运行make command2.timestamp
不会执行任何操作。command2.timestamp
否则,它首先运行command1
(除非command1.timestamp
已经存在),然后运行command2
。