shell - 可恢复脚本的最佳选择

标签 shell unix

我正在编写一个脚本,该脚本按顺序执行大约 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/

相关文章:

python - 使用 vim、shell 或 python 移动小数点

bash - 如何在 shell 脚本中从 YML 中删除子 block ?

bash - 让 shell 提示等待所有进程完成

unix - 如何在 zip (Linux) 中获取文件名和总数

unix - 将时间添加到 mysqldump cron 作业?

linux - 在 Unix shell 中,如何检查用户的权限,如果用户没有权限,如何产生错误消息?

bash - 如何将数字拆分为字符数组

bash - 在其余命令行参数之前搜索一个命令行参数

mysql - 在 unix 终端中打印可读的 SQL 输出

c++ - 抑制 system() 控制台输出