1

ループで実行し、一連のコマンドを実行する必要があるシェル スクリプトがあり、それが終了すると、ループが繰り返されます。各コマンドの間に、数分間のスリープ コマンドがあります。「ジョブ」は決して終了してはなりません。スクリプトで起動時間を開始することはできますが、システムの再起動時にコマンドのシーケンスで中断したところから続行する必要があります。

どうすればこれを最もよく達成できますか? コマンドのキューの MySQL テーブルを作成し、正常に実行されるたびに各行を削除する必要がありますか? 次に、ループが完了すると、キュー テーブルにデータが再入力され、先頭から開始されます。

これをより簡単にするために何かが欠けているようです。有益な洞察をお寄せいただきありがとうございます。

4

3 に答える 3

2

次のようにコードを書き直すことをお勧めします。

while: ; do
    case $step in
        0) command_1 && ((step++)) ;;
        1) command_2 && ((step++)) ;;
        ...
        9) command_9 && step=0 ;;
        *) echo "ERROR" >&2 ; exit 1 ;;
    esac
done

したがって、 の値をテストすることで、何が行われたかがわかりますstep

次に、ループが実行されるtrap前にa を設定して、終了時に の値がログ ファイルに書き込まれるようにすることができます。whilestep

trap "echo step=$step > log_file" EXIT

次に、sourceスクリプトの開始時にログ ファイルを参照するだけで、最後のログ ファイルは停止した場所からジョブを続行します。

于 2013-01-26T03:38:21.397 に答える
0

この場合、MySQL はかなり複雑なソリューションのように思えます。一般的に、ある種のファイルシステムベースのマーカーについて考えます。実行の現在の状態を 1 つまたは複数のファイル (例: ) に保持し/var/run、スクリプトが起動時にこれらのファイルをチェックするようにすることができます。

1 つのステップを完了すると、実行する必要がある次のステップを反映するようにファイルの名前を変更します。

最後に、名前を変更するか削除して、次回スクリプトが実行されたときに新しいサイクルが開始されるようにします。

于 2013-01-25T12:06:52.750 に答える
0

これにはcronジョブを使用できると思います。cron ジョブは毎分実行でき、「ロック ファイル」戦略を使用すると、ロック ファイルが存在しない場合にのみスクリプトを実行できます。

于 2013-01-25T12:08:57.807 に答える