我正在尝试编写一个命令来测试数据是否写入文件。我的第一个方法是:
- 开始在后台阅读。
- 将一些数据写入文件。
- 等待读者找到结果。
- 无限重复以查看是否存在时间问题。
以脚本形式:
while true
do
grep -q foo <(tail -n0 -f /var/log/syslog) &
logger foo && logger line && wait
done
(该logger line
命令是为了避免last message repeated N times
文件中出现行)
此版本通常会在卡住wait
命令之前循环一次或两次,因此看起来在写入文件tail
之前没有时间开始读取。logger foo
最好的方法是什么保证即tail
在继续之前阅读?这些解决方法并不理想:
之前暂停
logger
(在慢速文件系统的情况下不起作用)sleep 1 && logger foo && logger line && wait
启动第二个阅读器,并假设第一个阅读器在第二个阅读器显示时已开始阅读。在卡住之前循环了几千次:
grep -q foo <(tail -n0 -f /var/log/syslog) & grep -q bar <(tail -n0 -f /var/log/syslog) & while kill -0 $! do logger bar logger line done logger foo && logger line && wait
答案1
这是一种方法,在确定阅读器确实正在阅读后重新使用它:
while true
do
exec 3<> myfifo
tail -n0 -f /var/log/syslog >&3 &
tailproc=$!
while ! grep -q start <&3
do
logger start
logger line
done
grep -q end <&3 &
logger end
logger line
wait $!
exec 3<&-
exec 3>&-
kill $tailproc
done
自从作者被阻止而无人阅读(在第一个和第二个grep
命令之间)第二个命令不可能grep
错过下一行。
它已经运行了数万次迭代(基于输出中的进程 ID)而没有卡住。