我是否错过了一些东西,因为这个循环有时无法正常工作?
#!/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 ...
。