ループが機能しない[閉じる]

ループが機能しない[閉じる]

このループが時々正常に動作しないので、何か抜けましたか?

#!/bin/bash

Data="/path/to/data.txt"
while true
do
    if [ -f "$Data" ]; then
        rows=$(tail -n +1 "$Data" | wc -l)
            if [ "$rows" = 0 ]; then
                    rm "$Data"
                else
                        line=$(sed -e 1p $Data);
                        IFS=', ' read -a array <<< "$line";
                        exec > >(tee /var/www/report.txt) 2>&1
                        bash -c "/path/to/program.sh -i ${array[0]} -p ${array[1]} -r ${array[2]} -t ${array[3]}" | rm "$Data"
            fi
    fi
   sleep 1
done

無限ループの目的は、このスクリプトを呼び出すときにそれをバックグラウンドプロセスとして使用することです。

答え1

私が正しく理解した場合、一部のプロセスは名前付きファイルを上書きしており、新しいコンテンツが表示されるたび$Dataにコマンドを呼び出そうとしています。公開されたコードには、tail-wcテストとsedライン抽出の間に渡される競合条件があります。

次のように要件を変更することをお勧めします。

  • ファイルを上書きするのではなく、ファイルに行を追加するスクリプトを作成し、

  • 読み取りスクリプトは、tailを使用して新しく作成された行を読み取ります。同様のものを使用できますtail -f "$Data" | while read ...

関連情報