Stderr'i ekrana yazmak ve BOTH stderr ve stdout'u bir dosyaya yazmak - VE stderr ve stdout satırlarının her ikisi de ekrana yazılsalar, aynı sırayla ortaya çıkar:
Özellikle ekrana yazdıysanız, özellikle "aynı diziye" sahip olmayla ilgili kısmı zor bir problem olarak ortaya çıkıyor. Basit bir ifadeyle: Her birini kendi dosyasına yazın, her bir satırı (her dosyadaki) satırın tam olarak üretildiği zamanla işaretlemek için bazı arka plan işlem sihirleri uygulayın ve ardından: "tail --follow" stderr dosyasını ekrana getirin , ancak BOTH "stderr" ve "stdout" u birlikte görmek için - sırayla - iki dosyayı (her satırda tam zamanlı işaretlerle) birlikte sıralayın.
Kod:
# Set the location of output and the "first name" of the log file(s)
pth=$HOME
ffn=my_log_filename_with_no_extension
date >>$pth/$ffn.out
date >>$pth/$ffn.err
# Start background processes to handle 2 files, by rewriting each one line-by-line as each line is added, putting a label at front of line
tail -f $pth/$ffn.out | perl -nle 'use Time::HiRes qw(time);print substr(time."0000",0,16)."|1|".$_' >>$pth/$ffn.out.txt &
tail -f $pth/$ffn.err | perl -nle 'use Time::HiRes qw(time);print substr(time."0000",0,16)."|2|".$_' >>$pth/$ffn.err.txt &
sleep 1
# Remember the process id of each of 2 background processes
export idout=`ps -ef | grep "tail -f $pth/$ffn.out" | grep -v 'grep' | perl -pe 's/\s+/\t/g' | cut -f2`
export iderr=`ps -ef | grep "tail -f $pth/$ffn.err" | grep -v 'grep' | perl -pe 's/\s+/\t/g' | cut -f2`
# Run the command, sending stdout to one file, and stderr to a 2nd file
bash mycommand.sh 1>>$pth/$ffn.out 2>>$pth/$ffn.err
# Remember the exit code of the command
myexit=$?
# Kill the two background processes
ps -ef | perl -lne 'print if m/^\S+\s+$ENV{"idout"}/'
echo kill $idout
kill $idout
ps -ef | perl -lne 'print if m/^\S+\s+$ENV{"iderr"}/'
echo kill $iderr
kill $iderr
date
echo "Exit code: $myexit for '$listname', list item# '$ix', bookcode '$bookcode'"
Evet, bu ayrıntılı görünüyor ve 4 çıktı dosyasıyla sonuçlanıyor (bunlardan 2'sini silebilirsiniz). Bunun çözülmesi zor bir sorun olduğu anlaşılıyor, bu yüzden birkaç mekanizma aldı.
Sonunda, beklediğiniz sırada BOTH stdout ve stderr sonuçlarını görmek için şunu çalıştırın:
cat $pth/$ffn.out.txt $pth/$ffn.err.txt | sort
Dizinin, en azından hem stdout hem de stderr'e sahip olacağına yakın olmasının tek nedeni, ekrana basitçe gitmesidir: Her satır, milisaniyeye kadar olan bir zaman damgası ile işaretlenir.
İşlem devam ederken ekranda stderr'i görmek için şunu kullanın:
tail -f $pth/$ffn.out
Asıl soru sorulduktan uzun süre sonra buraya gelen birine yardım edecek umuduyla.