我正在编写一个脚本,该脚本按顺序执行大约 10 个后端进程,具体取决于前一个进程是否正确执行。
现在让我们假设这样的场景,假设第 5 个进程失败并且脚本出来了。但是我想以一种方式对其进行编码,以便下次用户运行它时(在删除由于上次退出的脚本而导致的错误之后),他应该能够从第 5 个进程开始运行,而不是从第 1 个进程再次运行。
更具体地说,假设以下是脚本:
Script Starts
Process1
if [ $? -eq 0 ] then
Process2
if [ $? -eq 0 ] then
Process3
if [ $? -eq 0 ] then
..
..
..
..
if [ $? -eq 0 ] then
Process10
else
exit
因此,如果任何一个进程未能以状态 0 完成,脚本将随时退出。因此,如果 process5 失败,并且用户更正问题并重新启动脚本,脚本应该再次从 process5 开始,而不是 process1 或至少应该有一个选项供用户选择,如果他想恢复脚本或从头开始,即 process1。
我们可以用所有可能的方式编写这种脚本,还请记住,我不允许使用临时数据库,我可以在其中存储每个进程的状态。
我需要在 unix 中使用 sh(shell 脚本)编写代码。
最佳答案
一个简单的解决方案是编写标记文件:
#/bin/sh
set -e # Automatically abort if any simple command fails
if ! test -f cmd1-stamp; cmd1; fi
touch cmd1-stamp
if ! test -f cmd2-stamp; cmd2; fi
touch cmd2-stamp
脚本执行时,如果cmd1-stamp
存在,则cmd1
不执行。否则,执行 cmd1
。如果失败,脚本将中止。请注意,编写 test -f cmd1-stamp || 是非常诱人的cmd1
,这似乎有效(在 bash 中),但 shell 规范声明如果失败的简单命令 不是 AND 或 OR 列表的一部分
,shell 将中止,并且我怀疑这是(又一个)不符合规范的 bash 实例。 (虽然它似乎没有指定如果失败的命令是 AND 或 OR 列表的一部分,shell 将不会中止。)
关于shell - 可恢复脚本的最佳选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14044199/