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

无情 阅读:171 2025-06-02 22:19:02 评论:0

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

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号