[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Standard-Fehlerausgabe pipen



Am Dienstag 05 September 2006 23:06 schrieb Martin Steigerwald:
> Am Dienstag 05 September 2006 21:29 schrieb Christian Paul:
> > Am Dienstag, 5. September 2006 12:40 schrieb Martin Steigerwald:
> > > Hallo,
> > >
> > > ich möchte gerne mit der Bash (3.1-5)  die Standard-Fehler-Ausgabe
> > > eines Befehls pipen. Mein Ansatz ist:
> > >
> > > strace free 1>/dev/null | cat
> > >
> > > Doch das liefert nicht das gewünschte Ergebnis und sogar eine
> > > Fehlermeldung:
> >
> > [..]
> > Ich empfehle zur Lektüre:
> > http://www.thomashertweck.de/redir.html
> > hat mir zum Verständnis weitergeholfen.
>
> Hallo,
>
> vielen Dank für die ganzen  Hinweise!
>
> martin@deepdance:~ -> strace free 2>test
>              total       used       free     shared    buffers    
> cached Mem:        775136     753772      21364          0          0  
>   404264 -/+ buffers/cache:     349508     425628
> Swap:       979924      74992     904932
>
>
> Die vier Writes möchte ich haben:
>
> martin@deepdance:~ -> tail -n8 test
> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
> 0) = 0xb7f7b000
> write(1, "             total       used   "..., 74) = 74
> write(1, "Mem:        775136     753772   "..., 74) = 74
> write(1, "-/+ buffers/cache:     349508   "..., 41) = 41
> write(1, "Swap:       979924      74992   "..., 41) = 41
> munmap(0xb7f7b000, 4096)                = 0
> exit_group(0)                           = ?
> Process 3719 detached
>
>
> Genau das bekomme ich mit keiner dieser Varianten hin:
>
> strace free 2>&1 >/dev/null | tail -n8
> (strace free 1>/dev/null) 2>&1 | tail -n8
> strace free 2>&1 1>/dev/null | tail -n8
>
>
> Ich erhalte immer:
>
> martin@deepdance:~ -> strace free 2>&1 1>/dev/null | tail -n8
> read(3, "MemTotal:       775136 kB\nMemFre"..., 1023) = 598
> fstat64(1, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
> ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbff83c74) = -1 ENOTTY
> (Inappropriate ioctl for device)
> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
> 0) = 0xb7eea000
> write(1, "             total       used   "..., 230) = 230
> munmap(0xb7eea000, 4096)                = 0
> exit_group(0)                           = ?
> Process 6464 detached
>
> Da ist nur der erste Write und eben die Fehlermeldung zu dem
> ioctl-Call, der aber im der obigen test-Datei nicht ausgeführt wird.
>
>
> Tolle Kniffel-Aufgabe, oder? Komischerweise ging es einmal mit der
> letzten Variante, aber das konnte ich dann nicht reproduzieren...
>
> Ich glaub langsam, dass da strace einfach nicht mitspielt... vielleicht
> ist der ioctl von strace und nicht von free... Könnte das ein Bug sein?
> Oder einfach ein Nebeneffekt von strace? Meinungen?

Hallo nochmal,

also ich hab vermutet, dass es nicht geht, weil strace ein tty braucht und 
dies nicht bekommt, wenn man /dev/null verwendet. Das könnte es sein:

"strace free 1>test" geht ohne Fehler, während "strace free 1>/dev/null" 
den Fehler wirft.


Warum es dann nur noch ein write() ist, ist klar:

martin@deepdance:~ -> strace free 2>&1 | tail -n8
write(1, "             total       used   "..., 230             total       
used       free     shared    buffers     cached
Mem:        775136     754948      20188          0          0     405904
-/+ buffers/cache:     349044     426092
Swap:       979924      74912     905012
) = 230
munmap(0xb7f2b000, 4096)                = 0
exit_group(0)                           = ?
Process 12573 detached


Bei Umleitung werden für printf (von free verwenndet) offenbar größere 
Buffer verwendet und der ganze Text mit einem write()-Aufruf ausgegeben. 
Was ja auch Sinn macht, wenn es nicht auf eine zeilenweise Aufgabe 
ankommt. Wobei man den Unterschied wahrscheinlich nicht sehen kann.

Na, wieder was gelernt ;).

Grüße,
-- 
Martin 'Helios' Steigerwald - http://www.Lichtvoll.de
GPG: 03B0 0D6C 0040 0710 4AFA  B82F 991B EAAC A599 84C7



Reply to: