並列クエリの再実行ループスクリプト

並列クエリの再実行ループスクリプト

シェルスクリプトには次のものがあります。

for file in $local_dir/myfile.log.*; 
    do 
        file_name=$(basename $file); 
        server_name=$(echo $file_name | cut -f 3 -d '.');
        file_location=$(echo $file);

        mv $file_location $local_dir/in_progress1.log

        mysql -hxxx -P3306 -uxxx -pxxx -e "set @server_name='${server_name}'; source ${sql_script};"

        rm $local_dir/in_progress1.log
    done

デフォルトでは、基準に一致するディレクトリ内のすべてのファイルを取得し、ファイル名からサーバー名を抽出し、処理のためにMySQLスクリプトに渡します。

10個のファイルがあるかどうかを知りたいです。各ファイルの完了には60秒かかり、5分後にシェルスクリプトの2番目のインスタンスを起動します。

  • a) 2番目のスクリプトがまだ処理されていないファイルを表示できますか?
  • b) ファイルを削除すると最初に問題が発生しますか?

それとも問題なく並列に実行できますか?

ベストアンサー1

「60秒」(または「5分」)は単なる良い見積もりであると考えることができます。バッチを分離する場合(間欠的に重複するログファイルを除いて問題はありません)、バッチ番号を進行中のファイル命名規則の一部にすることをお勧めします。

このような:

[[ -s ]] $local_dir/batch || echo 0 > $local_dir/batch
batch=$(echo $local_dir/batch)
expr $batch + 1 >$local_dir/batch

for ループの前とループの先頭で、パターンが実際のファイルと一致することを確認します。

[[ -f "$file" ]] || continue

そして、ファイル名にバッチ番号を使用します。

mv $file_location $local_dir/in_progress$batch.log

前後。これは衝突の危険を減らします。

おすすめ記事