从TTY到PHP的AWK管道输出

时间:2014-06-06 19:35:02

标签: php linux bash debian tty

我有一个tty设备(/ dev / ttyUSB0),它偶尔会以Cycle 1: 30662 ms, 117.41 W的形式输出一个字符串。我正在使用一个简单的bash脚本来处理它:

#!/bin/sh
stty -F /dev/ttyUSB0 57600

cd /home/pi
while true; do
 cat /dev/ttyUSB0 | awk '{ print $0 > "/dev/stderr"; if (/^Cycle/) { print "update kWh.rrd N:" $5 } }' | php5 test.php
 sleep 1
done

test.php脚本如下所示:

<?php
stream_set_blocking(STDIN, 0);
$line = trim(fgets(STDIN));

$file = 'kwhoutput.txt';
$current = file_get_contents($file);
$current .= $line;
file_put_contents($file, $current);
?>

但是,kwhoutput.txt仍为空。为什么这不起作用?

1 个答案:

答案 0 :(得分:1)

awk正在缓冲您的数据。使用fflush()在每个输出行后刷新缓冲区:

awk '{
  print $0 > "/dev/stderr"; 
  if (/^Cycle/) { 
    print "update kWh.rrd N:" $5;
    fflush(); 
  } 
}'  < /dev/ttyUSB0  | php5 test.php

还要确保/dev/ttyUSB0实际输出一行(由\n终止),而不仅仅是一串数据。

您还应该将PHP脚本修复为:

  1. 读取多行并逐个追加(否则,脚本将跳过其他所有行)。
  2. 了解如何在php中追加文件。读取整个文件,在内存中连接一个字符串,然后编写整个文件就不行了。