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 で完了できなかった場合、スクリプトはいつでも終了します。したがって、プロセス 5 が失敗し、ユーザーが問題を修正してスクリプトを再起動した場合、スクリプトはプロセス 1 ではなくプロセス 5 から再度開始する必要があります。スクリプトを再開したい場合、またはプロセス 1 などの最初からやり直したい場合は、ユーザーのオプションにする必要があります。

この種のスクリプトをコーディングできるすべての方法についても覚えておいてください。各プロセスのステータスを保存できる一時的なデータベースを使用することは許可されていません。

UNIX で sh (シェル スクリプト) をコーディングする必要があります。

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で)機能するように見えますが、シェルの仕様では、単純なコマンドが失敗した場合にシェルが中止されると記載されており、is not a part of an AND or OR listこれは準拠していないbashの(さらに別の)インスタンスであると思われます仕様。(ただし、失敗したコマンドが AND または OR リストの一部である場合、シェルが中止されないように指定されているようには見えません。)

于 2012-12-26T18:02:59.363 に答える