Để viết stderr để sàng lọc và ghi BÓNG stderr và stdout vào một tệp - VÀ có các dòng cho stderr và stdout xuất hiện theo cùng một trình tự nếu cả hai được ghi vào màn hình:
Hóa ra đó là một vấn đề khó khăn, đặc biệt là phần có "trình tự tương tự" mà bạn mong đợi nếu bạn chỉ đơn giản viết chúng lên màn hình. Nói một cách đơn giản: Viết từng tệp vào tệp riêng của mình, thực hiện một số phép thuật xử lý nền để đánh dấu từng dòng (trong mỗi tệp) với thời gian chính xác mà dòng được tạo ra, sau đó: "tail --follow" tệp stderr vào màn hình , nhưng để xem cả hai "stderr" và "stdout" cùng nhau - theo thứ tự - sắp xếp hai tệp (với các dấu thời gian chính xác trên mỗi dòng) với nhau.
Mã số:
# 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'"
Vâng, điều này có vẻ phức tạp, và nó dẫn đến 4 tệp đầu ra (2 trong số đó bạn có thể xóa). Có vẻ như đây là một vấn đề khó giải quyết, vì vậy phải mất một số cơ chế.
Cuối cùng, để xem kết quả từ Bout stdout và stderr trong chuỗi bạn mong đợi, hãy chạy nó:
cat $pth/$ffn.out.txt $pth/$ffn.err.txt | sort
Lý do duy nhất mà chuỗi ít nhất rất gần với những gì nó đã có cả thiết bị xuất chuẩn và thiết bị xuất chuẩn chỉ đơn giản là đi đến màn hình là: Mỗi dòng được đánh dấu bằng dấu thời gian xuống đến mili giây.
Để xem stderr trên màn hình khi quá trình diễn ra, hãy sử dụng:
tail -f $pth/$ffn.out
Hy vọng rằng sẽ giúp được ai đó, người đã đến đây rất lâu sau khi câu hỏi ban đầu được hỏi.