複雑なシャットダウンと回復プロセスを実行するスクリプトがあります。いくつかの長期実行コマンドを実行します。いくつかは約10分かかり、他の人はより速くかかります。
これらすべてのコマンドをファイルに保存し、チェックポイントで実行できるソフトウェアはありますか?たとえば、1 つずつ実行し、どちらが最後に実行されたかを覚えておくか、すべて実行し、そのうちの 1 つが中断されたら、その時点からやり直すことができます。
答え1
各長期実行コマンドを実行した後は、そのコマンドが実行されたことを覚えておく必要があります。何が起こったのかを覚える方法は、情報をファイルに保存することです。
これらのコマンドのいずれかがファイルを生成すると、ファイルが存在するかどうかをテストできます。参考にするいくつかの点があります。
- コマンドが出力ファイルを生成し、複数のステップにわたって入力し、途中で失敗すると、最終的に部分ファイルが生成されます。回避策は、コマンドが一時ファイルに書き込むようにし、コマンドが正常に完了した後に一時ファイルの名前を最終名に変更することです。
- コマンドが実行される前に出力ファイルがすでに存在する場合は、出力ファイルが最新であることを確認する方法が必要です。この問題は通常、入力ファイルと出力ファイルの修正時間を比較することで解決できます。出力ファイルが入力ファイルより最新の場合は再生成されたことを示します。
これは基本的な作業です。自動化ツールの構築。伝統的なツールを使用できます。作る。これは、「ファイルBがファイルAから構築され、AがBより最新であるか、Bが存在しない場合にAからBを生成するコマンドを実行します」という概念に基づいて構築されました。構文は次のとおりです。
B: A
command-to-generate-B-from-A
2 行目は、空白ではなくタブ文字で始まります。
コマンドが出力ファイルを自動的に生成しない場合は、それを一時ファイルに書き込みます。
B: A
mycommand <A >B.tmp
mv B.tmp B
失敗した場合、mycommand
makeは2番目のコマンドを実行しないため、B
コマンドは生成されません。
Bを生成するにはコマンドを実行しますmake B
。 Bがすでに存在し、Aよりも最新の場合、makeはmycommand
再実行されません。
チェーンルールを自動的に定式化します。 AからBをビルドするルールとBからCをビルドするルールがあり、Aのみが存在する場合はmake C
自動的にBをビルドしてからCをビルドします。
コマンドが実行されたことを示すファイルがない場合は、記憶する空のファイルを作成できます。
command1.timestamp:
command1
touch command1.timestamp
command2.timestamp:
command2
touch command2.timestamp
すでに存在する場合、実行してもmake command2.timestamp
何も起こりません。command2.timestamp
それ以外の場合は、最初に実行してからcommand1
(command1.timestamp
すでに存在しない限り)実行しますcommand2
。