Am 30.08.19 um 23:24 schrieb Heiko Schlittermann:
Thomas Güttler <guettl...@thomas-guettler.de> (Fr 30 Aug 2019 17:42:59 CEST):
Ich bin froh so die Ursache des Fehlers gefunden zu haben.
Hier der Code:  https://github.com/guettli/wrap_and_log_calls

Ich verstehe nicht viel von Py, aber es sieht mir so aus, als wenn Du
erst die Daten sammelst und dann ins Log schreibst. Ist das gut? Warum
nicht in der While True Schleife nach dem select gleich ins Log
schreiben, was Du gelesen hast?

Oder noch besser, stdout und stderr das Prozesses auf den fd des
Logfiles legen und dann exec des gewünschten Kommandos.

Analog zu

     #!/bin/sh
     exec "$@" 1>logfile 2>&1

oder gleich so wie diese zwei Zeilen. Was habe ich verpasst, das Dein
Script mehr macht (ausser, daß er noch Blümchen dran malt mit Datum und
so und in der Ausgabe trennt nach stderr und stdout. Letzteres Feature
hättest Du auf der Konsole auch nicht, wenn beide Datenströme direkt
dorthin gehen.)

Zum einen will ich die Parent-Prozesse sehen. Also nicht den einen, sondern 
alle Elternprozesse
bis ganz nach oben.

Ich habe die Befürchtung, dass `exec "$@"` zwar meist funktioniert, aber es 
Sonderfälle gibt,
bei denen es nicht klappt. Wenn zB das Argument ein Dollar, Semikolon oder 
Newlinezeichen enthält.


Wenn ich `#!/bin/sh` sehe, dann werde ich total nervös. Dass kann ja alles 
mögliche sein. Eine Bash,
eine Dash, unter Solarix/AIX noch mal etwas anderes.

stdout/stderr sollen ausgegeben getrennt ausgegeben werden, nicht gemeinsam.

Außerdem ist die Dopplung des Stroms nötig. Also ins Logfile und auf stdout/stderr (zB 
mit "tee").




Da geht vielleicht das hier:

     #!/bin/bash
     exec 3>/tmp/log
     exec "$@" 1> >(sed -u 's/^/out: /' >&3) 2> >(sed -u 's/^/err: /' >&3)

Man kann auch noch den FD 3 einsparen.

Obige Zeile verstehe ich nicht mehr. Ich schreibe seit langem keine 
Shell-Scripte mehr.

Vermutlich wird das zeilenweise gepuffert.
Es gibt aber Aufrufer, die wollen zB den Fortschrittsbalken auslesen um den dann
schön in einer GUI anzuzeigen. Dafür darf der Wrapper nicht puffern

Ich bin mir sicher, dass es möglich ist, dass auch in der Shell zu lösen.


Gruß,
  Thomas

--
Thomas Guettler http://www.thomas-guettler.de/
I am looking for feedback: https://github.com/guettli/programming-guidelines

Antwort per Email an