ฉันมีสคริปต์ที่ฉันกำลังทำงานอยู่ ระบบ
ซึ่งมีบันทึกการดีบักบางอย่างที่ฉันต้องการส่งไปยังทั้ง stdout (ซึ่งควรลงท้ายด้วยสมุดรายวันระบบ ซึ่งสามารถดูได้ด้วย วารสาร ctl
) เช่นเดียวกับไฟล์บันทึกในระบบไฟล์ของฉัน
โดยทั่วไปแล้วฉันจะเข้าถึง ที
เพื่อทำสิ่งนี้ให้สำเร็จ (เขียนไปยัง stdout และไฟล์) และใช้งานได้ดีเมื่อฉันเรียกใช้สคริปต์ด้วยตัวเอง (ฉันเห็นบันทึกทั้งหมดของฉันบนคอนโซลและในไฟล์บันทึกของฉัน) แต่เมื่อฉันเรียกใช้ภายใต้ ระบบ
ฉันขาดเอาต์พุตจำนวนมากจาก ที
ในสมุดรายวันระบบ (แม้ว่าบันทึกทั้งหมด เป็น อยู่ในล็อกไฟล์)
ฉันได้ลองทำบางสิ่งที่ยังไม่สามารถแก้ปัญหาได้:
stdbuf
(ตามที่แนะนำ ที่นี่ สำหรับการบังคับให้เอาต์พุตบัฟเฟอร์บรรทัด) ใน my ExecStart=
ในไฟล์บริการของฉัน
StandardOutput = วารสาร + คอนโซล
ในไฟล์บริการของฉัน (DefaultStandardOutput
ไม่ได้ตั้งค่าใน /etc/systemd/system.conf
ดังนั้นจึงมีค่าเริ่มต้นเป็น วารสาร
).
- ถอด
ที
, ดังนั้น เสียงสะท้อน
เพียงเขียนโดยตรงไปยัง stdout เมื่อฉันทำสิ่งนี้ ทำ ดูบันทึกทั้งหมดในบันทึกของระบบ (แต่ฉันทำไฟล์บันทึกหาย) ฉันเดาว่าฉันทำเองได้ ที
ด้วยฟังก์ชันที่ทำสองอย่าง เสียงสะท้อน
s (หนึ่งครั้งไปที่ไฟล์บันทึก หนึ่งครั้งเพื่อ stdout) แต่นั่นให้ความรู้สึกเหมือนแฮ็ค ฉันต้องการใช้ ที
ซึ่งมีอยู่แล้วเพื่อการนี้...
ฉันได้จำลองปัญหานี้ใน Manjaro และ Ubuntu (systemd 249 (249.4-2-มันจาโร)
และ systemd 245 (245.4-4ubuntu3.5)
), แต่ฉัน ไม่สามารถ ทำซ้ำบน Debian 11 (systemd 247 (247.3-6)
). ฉันไม่เห็นความแตกต่างที่ชัดเจนในการกำหนดค่าใดๆ ของฉันภายใต้ /etc/systemd
ระหว่างระบบ Debian ที่ใช้งานได้กับระบบ Manjaro ที่ไม่ทำงาน ฉันไม่แน่ใจว่าการกำหนดค่าระบบอื่นใดที่อาจส่งผลต่อสิ่งนี้...
ฉันมีคำแนะนำในการทำซ้ำฉบับเต็ม ที่นี่.
สคริปต์ของฉัน
อาศัยอยู่ที่ /tmp/tee_test.sh
.
#!/bin/bash
LOGFILE=/tmp/testtee.log
echo > "$LOGFILE"
echo "ฉันชอบพาย" | ที -a "$LOGFILE"
ฉัน=2
ในขณะที่ :; ทำ
echo "ฉันจะกินพิซซ่าชิ้นละ $i" | ที -a "$LOGFILE"
((i++))
นอน1
เสร็จแล้ว
หน่วย systemd ของฉัน
อาศัยอยู่ที่ ~/.config/systemd/user/tee_test.service
และเต็มไปด้วย systemctl --user daemon-โหลดซ้ำ
ทุกครั้งที่ฉันเปลี่ยนมัน
[หน่วย]
คำอธิบาย=ทดสอบแท่นวางภายใต้ systemd
[บริการ]
# ผลลัพธ์เดียวกันกับหนึ่งในสองตัวแปรต่อไปนี้
ExecStart=/tmp/tee_test.sh
# ExecStart=stdbuf -i0 -o0 -e0 /tmp/tee_test.sh
# ผลลัพธ์เดียวกันไม่ว่าจะมีหรือไม่มีผู้ชายคนนี้
StandardOutput = วารสาร + คอนโซล
[ติดตั้ง]
ต้องการโดย=default.target
บันทึกในสมุดรายวันระบบ
รับชมด้วย Journalctl --user -x -u tee_test.service
. ฉันเห็นเพียงส่วนย่อยของบันทึก
20 ต.ค. 09:49:03 น. grinchel systemd[2678]: เริ่มการทดสอบแท่นทีออฟภายใต้ systemd
ââ เรื่อง: งานเริ่มต้นสำหรับหน่วย UNIT เสร็จสิ้นเรียบร้อยแล้ว
ââ กำหนดโดย: systemd
ââ การสนับสนุน: https://forum.manjaro.org/c/support
â
ââ งานเริ่มต้นสำหรับหน่วย UNIT เสร็จสิ้นเรียบร้อยแล้ว
â
ââ ตัวระบุงานคือ 8193
20 ตุลาคม 09:49:26 grinchel tee_test.sh[399363]: ฉันจะกินพิซซ่า 25 ชิ้น
20 ตุลาคม 09:49:40 grinchel tee_test.sh[400047]: ฉันจะกินพิซซ่า 39 ชิ้น
20 ต.ค. 09:49:48 น. grinchel tee_test.sh[400430]: ฉันจะกินพิซซ่า 47 ชิ้น
20 ต.ค. 09:49:49 น. grinchel tee_test.sh[400496]: ฉันจะกินพิซซ่า 48 ชิ้น
20 ต.ค. 09:49:50 น. grinchel tee_test.sh[400529]: ฉันจะกินพิซซ่า 49 ชิ้น
20 ตุลาคม 09:49:51 grinchel tee_test.sh[400595]: ฉันจะกินพิซซ่า 50 ชิ้น
20 ต.ค. 09:50:14 น. grinchel tee_test.sh[401790]: ฉันจะกินพิซซ่า 73 ชิ้น
20 ต.ค. 09:50:27 grinchel systemd[2678]: Stopping Test teeing under systemd...
บันทึกในไฟล์บันทึก
ในไฟล์บันทึกของฉัน ฉันเห็นบันทึกทั้งหมด
ผมชอบพาย
ฉันจะกินพิซซ่า 2 แผ่น
ฉันจะกินพิซซ่า 3 แผ่น
ฉันจะกินพิซซ่า 4 แผ่น
ฉันจะกินพิซซ่า 5 แผ่น
ฉันจะกินพิซซ่า 6 แผ่น
ฉันจะกินพิซซ่า 7 แผ่น
[...ตัดบรรทัดที่คล้ายกันหลายบรรทัด -- พวกมันทั้งหมดแสดงตามลำดับตามที่คาดไว้...]
ฉันจะกินพิซซ่า 84 ชิ้น
ฉันจะกินพิซซ่า 85 ชิ้น
ฉันจะกินพิซซ่า 86 ชิ้น
มีความคิดว่าเกิดอะไรขึ้นที่นี่? ฉันจะแน่ใจได้อย่างไรว่าผลลัพธ์ทั้งหมดจาก ที
ปรากฏในสมุดรายวันระบบของฉันหรือไม่