Score:0

วิธีตรวจสอบเอาต์พุตจาก "tee" แสดงเมื่อใช้ในสคริปต์ที่รันภายใต้ systemd

ธง vn

ฉันมีสคริปต์ที่ฉันกำลังทำงานอยู่ ระบบ ซึ่งมีบันทึกการดีบักบางอย่างที่ฉันต้องการส่งไปยังทั้ง 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 ชิ้น

มีความคิดว่าเกิดอะไรขึ้นที่นี่? ฉันจะแน่ใจได้อย่างไรว่าผลลัพธ์ทั้งหมดจาก ที ปรากฏในสมุดรายวันระบบของฉันหรือไม่

Ginnungagap avatar
gu flag
คุณลองดูว่าจะเกิดอะไรขึ้นถ้าคุณไม่ใช้ `tee` และปล่อยให้มันไปที่บันทึกเท่านั้น? คุณได้รับผลลัพธ์ที่สมบูรณ์แล้วหรือไม่
vn flag
@Ginnungagap ใช่ ถ้าฉันลบ `tee` ฉันจะเห็นผลลัพธ์ทั้งหมด เพิ่มสิ่งนี้ในรายการสิ่งที่ฉันได้ลองในโพสต์ของฉัน

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา