PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : standardout auf bildschirm und ins logfile (ohne tee)



neutrino1
03.05.2005, 14:22
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?

skynnyr
03.05.2005, 17:06
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?

tail -f ${LOGFILE} & tailPID=$!
machwas > ${LOGFILE}
kill -9 $tailPID

neutrino1
04.05.2005, 13:39
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:



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

ninguno
13.05.2005, 09:03
in der bash könntest du die $PIPESTATUS[] array variable verwenden:

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

Cyber
13.05.2005, 09:25
Hmm, könnte auch so gehen:


RETVALFILE="/tmp/"$(date +%s%N)
( PROGRAMM | tee -a $LOGFILE ; echo $? > $RETVALFILE )
RETVAL=`cat $RETVALFILE`
rm -rf $RETVALFILE

neutrino1
16.05.2005, 23:33
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

neutrino1
16.05.2005, 23:41
Hmm, könnte auch so gehen:


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