ดู stdout / stderr ของบริการ systemd


175

ฉันสร้างไฟล์เซอร์วิส systemd อย่างง่ายสำหรับแอปพลิเคชันที่กำหนดเอง แอปพลิเคชั่นทำงานได้ดีเมื่อฉันเรียกใช้ด้วยตนเอง แต่ CPU ของฉันเต็มเมื่อใช้งานกับ systemd

ฉันพยายามติดตามว่าปัญหาของฉันอยู่ที่ไหน แต่ฉันไม่รู้ว่าจะหาผลลัพธ์ได้จากที่ไหน

นี่คือไฟล์บริการของฉัน:

[Unit]
Description=Syncs files with a server when they change
Wants=network.target
After=network.target

[Service]
ExecStart=/usr/local/bin/filesync-client --port 2500
WorkingDirectory=/usr/local/lib/node_modules/filesync-client
Restart=always

[Install]
WantedBy=multi-user.target

ตลอดทั้งแอปพลิเคชันฉันส่งออกไปยัง stdout และ stderr

ฉันจะอ่านผลลัพธ์ของภูตของฉันได้อย่างไร

แก้ไข:

ฉันพบman systemd.execซึ่งกล่าวถึงStandardOutput=ตัวเลือก แต่ฉันไม่แน่ใจว่าจะใช้งานอย่างไร จากหน้าคน :

StandardOutput=

ควบคุมว่า file descriptor 1 (STDOUT) ของกระบวนการที่ดำเนินการเชื่อมต่ออยู่ ใช้เวลาหนึ่งของมรดก , null , TTY , syslog , kmsg , kmsg + คอนโซล , syslog + คอนโซลหรือซ็อกเก็ต

หากตั้งค่าเป็นสืบทอดตัวบ่งชี้ไฟล์ของอินพุตมาตรฐานจะทำซ้ำสำหรับเอาต์พุตมาตรฐาน หากตั้งค่าเป็นเอาท์พุทมาตรฐานแบบnullจะถูกเชื่อมต่อ/dev/nullด้วยเช่นทุกอย่างที่เขียนไปจะหายไป หากตั้งค่าเป็นเอาต์พุตมาตรฐานttyจะเชื่อมต่อกับ tty (ตามที่กำหนดค่าผ่านทางTTYPath=ดูด้านล่าง) หากใช้ TTY สำหรับเอาต์พุตเท่านั้นกระบวนการที่เรียกใช้จะไม่กลายเป็นกระบวนการควบคุมของเทอร์มินัลและจะไม่ล้มเหลวหรือรอให้กระบวนการอื่น ๆ ปล่อยเทอร์มินัล syslogเชื่อมต่อเอาต์พุตมาตรฐานกับ syslog (3) ตัวบันทึกระบบ kmsgเชื่อมต่อกับเคอร์เนลบัฟเฟอร์ซึ่งสามารถเข้าถึงได้ผ่าน dmesg (1) syslog + consoleและkmsg + consoleทำงานคล้ายกัน แต่คัดลอกผลลัพธ์ไปยังคอนโซลระบบเช่นกัน ซ็อกเก็ตเชื่อมต่อออกมาตรฐานซ็อกเก็ตจากการเปิดใช้ซ็อกเก็ต, StandardInput=ความหมายคล้ายกับตัวเลือกที่เกี่ยวข้องของ การตั้งค่านี้เป็นค่าเริ่มต้นที่จะรับช่วง

นี่หมายความว่านี่เป็นเพียงตัวเลือกเดียวของฉันหรือไม่ ยกตัวอย่างเช่นฉันต้องการเอาท์พุท/dev/shmหรืออะไรสักอย่าง ฉันคิดว่าฉันสามารถใช้ซ็อกเก็ตโดเมน Unix และเขียนผู้ฟังง่าย ๆ แต่ดูเหมือนไม่จำเป็นเล็กน้อย

ฉันต้องการสิ่งนี้เพื่อการดีบักและฉันอาจสิ้นสุดการลบบันทึกส่วนใหญ่และเปลี่ยนผลลัพธ์เป็น syslog


คุณลองตรวจสอบ/var/log/syslogผลลัพธ์แล้วหรือยัง ระบบส่วนใหญ่จะบันทึกสิ่งต่าง ๆ/var/log/ดังนั้นฉันจะเริ่มต้นด้วยการตรวจสอบที่นั่น คุณสามารถใช้grepเพื่อค้นหาข้อความหากคุณรู้ว่าผลลัพธ์: grep "my output" /var/logควรทำเคล็ดลับ
sbtkd85

@ sbtkd85 - ดีฉันไม่มี/var/log/syslogแต่/var/log/messagesทำเคล็ดลับ ปัญหาคือตามที่บันทึกภูตของฉันล้มเหลวในการเริ่มต้น แต่ฉันสามารถบอกได้ว่ามันยังคงทำงานอยู่เพราะมันมีเซิร์ฟเวอร์ HTTP และฉันสามารถค้นหาได้ ดูเหมือนว่าส่วนที่เหลือของบันทึกจะหายไป ...
beatgammit

ทำไมไม่ลองตั้งค่าStandardOutput=ttyเพื่อให้คุณสามารถเห็นสิ่งที่เกิดขึ้นเมื่อคุณเปิดภูตของคุณ มันควรจะส่งสัญญาณเทอร์มินัล (คุณอาจต้องใช้ttyS0หรือคล้ายกันเพื่อให้ได้ผลลัพธ์บนหน้าจอของคุณ)
sbtkd85

3
ไม่ควรใช้ตัวดำเนินการเปลี่ยนเส้นทาง IO มาตรฐานในบริบทนี้ บางสิ่งที่เหมือนกันExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
Deepak Mittal

สิ่งใดที่ใช้ซีพียูของคุณในทางที่ผิด มันคือ systemd บริการหรือระบบของคุณ (เช่นโดยการวางไข่บริการใหม่เพราะ systemd เป็นบ้า)?
เตอร์

คำตอบ:


183

ปรับปรุง

ในฐานะ mikemaccana บันทึกตอนนี้systemd journalเป็นอุปกรณ์บันทึกข้อมูลมาตรฐานสำหรับ distros ส่วนใหญ่ ในการดูstdoutและstderrของ systemd หน่วยใช้journalctlคำสั่ง

sudo journalctl -u [unit]

คำตอบเดิม

โดยค่าเริ่มต้นstdoutและstderrของหน่วย systemd จะถูกส่งไปยัง syslog

หากคุณกำลังใช้ systemd เต็มรูปแบบนี้จะเป็น accesible journalctlผ่าน ใน Fedora ควรเป็น/var/log/messagesแต่ syslog จะวางไว้ตรงที่กฎของคุณพูด

เนื่องจากวันที่โพสต์และสมมติว่าคนส่วนใหญ่ที่มีการสัมผัสกับ systemd จะผ่านฟางคุณอาจถูกตีโดยข้อผิดพลาดที่อธิบายที่นี่: https://bugzilla.redhat.com/show_bug.cgi?id=754938 มันมี คำอธิบายที่ดีเกี่ยวกับวิธีการทำงานทั้งหมดด้วยเช่นกัน =) (นี่เป็นข้อผิดพลาดในนโยบาย selinux ที่ทำให้ข้อความแสดงข้อผิดพลาดไม่ถูกบันทึกและได้รับการแก้ไขselinux-policy-3.10.0-58.fc16)


5
โปรดทราบว่าการใช้กลไกการบันทึกมาตรฐานเช่นนี้จะไม่สร้างบันทึกถาวรตามค่าเริ่มต้น ในการทำเช่นนั้นคุณจะต้องสร้าง / var / log / journal แล้วจึงเรียกใช้sudo systemctl restart systemd-journald
mlissner

1
สิ่งอำนวยความสะดวก syslog และลำดับความสำคัญ?
jrwren

2
สิ่งนี้ใช้งานได้สำหรับฉัน: StandardOutput=syslog+consoleและStandardError=syslog+consoleหลังจากนั้นผลลัพธ์ทั้งหมดจากหน่วยของฉันจะปรากฏใน journalctl ดูเหมือนว่าการตั้งค่าเริ่มต้นจะผิด (เช่น DefaultStandardOutput ใน /etc/systemd/system.conf)
gregn3

2
-fมีประโยชน์สำหรับฉัน ตามบันทึกการเปลี่ยนแปลงเกิดขึ้น (กรณีการใช้งานดังต่อไปนี้ถูกเซิร์ฟเวอร์ Minecraft ซึ่งทำงานเป็น daemon)
blaughw

2
นี่คือสิ่งที่ทำให้ฉันเป็นบ้า ... ในสมุดรายวันแบบขยาย Debian มาตรฐานจะไม่แสดงผลมาตรฐานใด ๆ ให้ฉันเลย ฉันได้ใช้และชัดเจน/usr/bin/stdbuf -oL <cmd> StandardOutput=journalยังคงไม่มีอะไร.
jlh

81

คำตอบที่สั้นกว่าง่ายกว่าไม่ใช่ดั้งเดิม:

sudo journalctl -u [unitfile]

โดยที่ [unitfile] เป็น.serviceชื่อsystemd เช่นจะเห็นข้อความจากmyapp.service,

sudo journalctl --unit=myapp

หากต้องการติดตามบันทึกในเวลาจริง:

sudo journalctl -f -u myapp

4
โปรดทราบว่าคุณอาจต้องทำsudoถ้าคุณได้รับNo journal files foundข้อผิดพลาด
bigjosh

5
syslog ไม่ใช่มรดก ...
Miles Rout

2
มันอยู่ใน Linux distros ปัจจุบัน คุณอาจชอบ syslog แต่ไม่เปลี่ยนสิ่งที่พวกเขาจัดส่ง
mikemaccana

1
แน่ใจ และมันยังใช้ syslog ประเด็นของฉันไม่ใช่ว่าไม่ได้ใช้ systemd แต่ syslog นั้นไม่ใช่มรดก
เขาวงกต

6
@JECompton หากการบันทึกบน Linux distros ปัจจุบันใช้ journald และไม่จำเป็นต้องใช้ syslog และใช้เพื่อความเข้ากันได้เท่านั้นดังนั้นจะต้องเป็นไปตามเหตุผลว่า syslog เป็นมรดก
mikemaccana
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.