Auch wenn der Thread schon etwas älter ist... Vielleicht interessiert's ja noch den ein oder anderen.
Ich hatte genau das gleiche Problem mit line-buffered und habe einen Ansatz, wie man es lösen kann.
Hintergrund: Nur dann, wenn die Ausgabe eines Befehls direkt auf ein tty (also dorthin, wo man "was sieht", z. B. ein Terminal) geleitet wird, erfolgt die sichtbare Ausgabe ungepuffert, das heißt, man sieht sie sofort.
Wird die Ausgabe auf allerdings irgendetwas anderes außer einem tty umgeleitet, puffert der Linux-Kernel 4 KB an Daten. Jedes vernünftige Programm ruft daher regelmäßig fflush() auf, damit wird der Puffer geleert und tatsächlich weitergeleitet. Das macht dtrace aber nicht.
Es gibt in Linux jedoch auch Pseudo-TTYs. Sie verhalten sich wie normale TTYs, können aber von beiden Enden per Software angesprochen werden. Sie finden sich immer in Paaren (Master und Slave). Z. B. ist /dev/ttyp0 ein Master und /dev/ptyp0 ein Slave. Alles, was man nun in den Master oder Slave reinschreibt, kommt auf der anderen Seite (Slave oder Master) wieder heraus. Die Kommunikation erfolgt grundsätzlich ungepuffert.
Somit funktioniert folgendes Konstrukt:
Einerseits:
# dtrace -* -s > /dev/ttyp0
Andererseits:
# grep "irgendwas" /dev/ptyp0
Das endgültige "Telefonklingeln-bei-Türklingeln"-Skript ist noch nicht fertig, dürfte aber erstmal machbar sein.