3

我正在编写一个脚本,它按顺序执行大约 10 个后端进程,具体取决于前一个进程是否在没有任何错误的情况下执行。

现在让我们假设这样的场景,假设第 5 个进程失败并且脚本出来了。但是我想以这样的方式对其进行编码,当用户下次运行它时(在删除了上次退出的脚本导致的错误之后),他应该能够从第 5 个进程开始运行,而不是从第一个进程开始运行。

更具体地说,假设以下是脚本:

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 脚本)编写代码。

4

1 回答 1

3

一个简单的解决方案是编写戳文件:

#/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 规范指出,如果简单命令失败is not a part of an AND or OR list,shell 将中止,我怀疑这是 bash 的(又一个)实例不符合规范。(虽然它似乎没有指定如果失败的命令是 AND 或 OR 列表的一部分,则 shell 不应中止。)

于 2012-12-26T18:02:59.363 回答