ฉันสร้างไฟล์เซอร์วิส 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/messages
ทำเคล็ดลับ ปัญหาคือตามที่บันทึกภูตของฉันล้มเหลวในการเริ่มต้น แต่ฉันสามารถบอกได้ว่ามันยังคงทำงานอยู่เพราะมันมีเซิร์ฟเวอร์ HTTP และฉันสามารถค้นหาได้ ดูเหมือนว่าส่วนที่เหลือของบันทึกจะหายไป ...
StandardOutput=tty
เพื่อให้คุณสามารถเห็นสิ่งที่เกิดขึ้นเมื่อคุณเปิดภูตของคุณ มันควรจะส่งสัญญาณเทอร์มินัล (คุณอาจต้องใช้ttyS0
หรือคล้ายกันเพื่อให้ได้ผลลัพธ์บนหน้าจอของคุณ)
ExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
/var/log/syslog
ผลลัพธ์แล้วหรือยัง ระบบส่วนใหญ่จะบันทึกสิ่งต่าง ๆ/var/log/
ดังนั้นฉันจะเริ่มต้นด้วยการตรวจสอบที่นั่น คุณสามารถใช้grep
เพื่อค้นหาข้อความหากคุณรู้ว่าผลลัพธ์:grep "my output" /var/log
ควรทำเคล็ดลับ