หากมีใครต้องการข้อมูลอย่างแท้จริงฉันขอแนะนำให้แนบgdb debugger กับ python interpreter ชั่วขณะหยุดภารกิจเรียกfsync(1)
( stdout ) ออกจากมัน (กลับมาทำงานต่อ) และอ่านไฟล์เอาต์พุต
ค้นหา/proc/$(pidof python)/fd
เพื่อดู descriptor ไฟล์ที่ถูกต้อง $(pidof x)
ส่งคืน PID ของกระบวนการชื่อ ' x
'
# your python script is running merrily over there.... with some PID you've determined.
#
# load gdb
gdb
#
# attach to python interpreter (use the number returned by $(pidof python))
attach 1234
#
# force a sync within the program's world (1 = stdout, which is redirected in your example)
call fsync(1)
#
# the call SHOULD have returned 0x0, sync successful. If you get 0xffffffff (-1), perhaps that wasn't stdout. 0=stdin, 1=stdout, 2=stderr
#
# remove our claws from poor python
detach
#
# we're done!
quit
ฉันใช้วิธีนี้เพื่อเปลี่ยนการตั้งค่าที่ปรับแต่งได้ตามต้องการ ... หลายสิ่งหลายอย่าง อนิจจาคุณสามารถเรียกใช้ฟังก์ชันที่กำหนดไว้ในโปรแกรมที่กำลังfsync
ทำงานได้เท่านั้น
(คำสั่ง gdb ' info functions
' จะแสดงรายการทั้งหมดของฟังก์ชั่นที่มีอยู่. เป็น แต่ระวัง. คุณกำลังปฏิบัติการสดในกระบวนการ.)
นอกจากนี้ยังมีคำสั่งpeekfd
(พบในpsmisc
แพ็คเกจบน Debian Jessie และอื่น ๆ ) ซึ่งจะช่วยให้คุณเห็นสิ่งที่ซ่อนอยู่ในบัฟเฟอร์ของกระบวนการ อีกครั้ง/proc/$(pidof python)/fd
จะแสดง file descriptors ที่ถูกต้องให้เป็นอาร์กิวเมนต์สำหรับ peekfd
หากคุณจำไม่ได้ว่า-u
สำหรับไพ ธ อนคุณสามารถใส่คำสั่งล่วงหน้าด้วยstdbuf
(ในcoreutils
ติดตั้งไว้แล้ว) เพื่อตั้งค่า stdin / stdout / stderr ให้เป็นบัฟเฟอร์บัฟเฟอร์หรือบล็อกบัฟเฟอร์ตามที่ต้องการ:
stdbuf -i 0 -o 0 -e 0 python myscript.py > unbuffered.output
แน่นอนว่าman pages
เป็นเพื่อนของคุณเฮ้! อาจเป็นชื่อแทนก็ได้เช่นกัน
alias python='python -u'
ตอนนี้หลามของคุณใช้-u
สำหรับความพยายามในบรรทัดคำสั่งของคุณเสมอ