Bashでのロールバックの実装

Bashでのロールバックの実装

私は主に起動/停止/状態で動作する段階的なタスクで構成されたスクリプトを持っています。

私が経験している問題は、起動時にすべての操作が失敗する可能性があり、安全なロールバックのために停止操作を使用する必要があることです。

Bashでどうすればいいですか?

私は次のことを考えています(動作しません)。

operation1_start() {}
operation2_start() {}
operation1_stop() {}
operation2_stop() {}

operation1_start && rollback=operation1_stop;$rollback
test_validity || $($rollback)
operation2_start && rollback=operation2_stop;$rollback
test_validity || $($rollback) 

ベストアンサー1

次の2つのシェルプログラミング技術が役に立ちます。

  • 走ればset -e、コマンドがゼロ以外の状態を返すと(ifまたはwhile条件などの明白なものがない限り)、シェルはすぐに終了します。
  • 走ればtrap 'somecode' EXITスクリプトが終了すると(明示的または暗黙的な終了のためset -e)、somecode最初に実行されます。エントリには、somecode最後$?のコマンドのステータスが含まれます。

したがって、次のように書くことができます。

(set -e; trap 'abort operation a' EXIT; perform operation a; )

ERRBashでは、代わりにトラップを設定できますEXITset -eこれらのトラップは、シェルがシャットダウンしたときにのみ実行されます。さらに、ERRトラップは関数に対してローカルです。

set -e
operation_a () {
  trap 'abort code' ERR
  perform operation a
}

可能であれば、ドラフトを最初に作成して実行する方が簡単です。原子取引を提出するための措置です。たとえば、ファイルに書き込む場合は、ターゲットディレクトリの一時ファイルに書き込み、新しいファイルを所定の位置に移動するをmv呼び出します。これはkill -9、停電のためにスクリプトが終了するとロールバックが実行されないため、ロールバックコードの形式でクリーンアップが必要なものよりはるかに強力です。

おすすめ記事