このループが時々正常に動作しないので、何か抜けましたか?
#!/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 ...
。