如何确保进程在继续之前已开始读取文件?

如何确保进程在继续之前已开始读取文件?

我正在尝试编写一个命令来测试数据是否写入文件。我的第一个方法是:

  1. 开始在后台阅读。
  2. 将一些数据写入文件。
  3. 等待读者找到结果。
  4. 无限重复以查看是否存在时间问题。

以脚本形式:

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)而没有卡住。

相关内容