standardout auf bildschirm und ins logfile (ohne tee)

neutrino1

neutrino1

Mitglied
Hi!

Ich möchte standardout sowohl am Bildschirm als auch in ein logfile schreiben. tee konnte ich nicht verwenden, da sonst der RC=0 (nämlich vom tee) ist, auch wenn das script einen Fehler produziert.
Nun hab ich das versucht:

exec 3> ${LOGFILE}
exec 1>&3
main

standardout sollte doch eigentlich in den filedeskriptor 3 kopiert werden und der soll ins logfile schreiben - das logfile wird zwar geschrieben, am Bildschirm ist nichts zu sehen.
Weiß wer, was ich da falsch mache?
 
Da ich nicht weiß, was du mit dem Splitten der Standardausgabe erreichen willst, ist mein Vorschlag möglicherweise sinnlos. Aber was hälst du von tail -f?
Code:
tail -f ${LOGFILE} & tailPID=$!
machwas > ${LOGFILE}
kill -9 $tailPID
 
Zuletzt bearbeitet:
Hi!

Das Skript wird von einem SchedulingTool gesteuert - dieses Tool kann nur den standardout darstellen und braucht außerdem den richtigen returncode (no nah) fürs scheduling. Trotzdem soll aber auch ein logfile geschrieben werden. Ich wollte halt einfach eine elegante Lösung.
Ich hab jetzt letzendich meine erste Lösung (dafür eine "russische") implentiert (in der function main sind andere function, die eine exit-function im Fehlerfallaufrufen:

Code:
export RC_FILE="${TMPDIR}/${SCRIPTNAME%_sh}.$$"
....
(main 2>&1;echo $? > ${RC_FILE}) |tee -a ${LOGFILE}
RC_MAIN=$(cat ${RC_FILE}) && rm -f ${RC_FILE}
....
exit ${RC_MAIN}

Trotzdem Danke für Deine Anregung!
Ciao
Robert
 
in der bash könntest du die $PIPESTATUS[] array variable verwenden:

main 2>&1 |tee -a ${LOGFILE}
exit ${PIPESTATUS[0]}
 
Hmm, könnte auch so gehen:
Code:
RETVALFILE="/tmp/"$(date +%s%N)
    ( PROGRAMM | tee -a $LOGFILE ; echo $? > $RETVALFILE )
    RETVAL=`cat $RETVALFILE`
rm -rf $RETVALFILE
 
ninguno schrieb:
in der bash könntest du die $PIPESTATUS[] array variable verwenden:

main 2>&1 |tee -a ${LOGFILE}
exit ${PIPESTATUS[0]}
Hi!

Danke, ist eine gute Idee, von der ich noch nichts gehört hatte.
Leider steht mir nur die 88-ksh zur Verfügung, und dort geht es nicht.

Ciao
 
Cyber schrieb:
Hmm, könnte auch so gehen:
Code:
RETVALFILE="/tmp/"$(date +%s%N)
    ( PROGRAMM | tee -a $LOGFILE ; echo $? > $RETVALFILE )
    RETVAL=`cat $RETVALFILE`
rm -rf $RETVALFILE
Hi!

Das genau hat nicht funktioniert, weil in $RETVALFILE der Returnstatus vom tee hineingeschrieben wird und der is 0, egal wie PROGRAMM endet.

Ciao
 

Ähnliche Themen

NAS-Drive Mount in Bash-Script über crontab

Keine grafische Oberfläche (Debian Installation)

Prblem mit zeilenweises auslesen von Datei und schreiben nach mysql

AWK Tip gesucht

Doppelte Dateien löschen.

Zurück
Oben