Linux: วิธีเปลี่ยนเส้นทาง stdout & stderr ไปยัง logger?


22

ฉันมีโปรแกรมที่ฉันจำเป็นต้องเรียกใช้เมื่อเริ่มต้นมันมีเอาต์พุตใน stdout และ stderr ที่ฉันต้องการเปลี่ยนเส้นทางไปยังบันทึกของระบบโดยใช้คำสั่ง logger สิ่งที่ฉันมีในสคริปต์เริ่มต้นคือ:

/ home / dirname / application_name -v | logger 2> & 1 &

นี่คือการเปลี่ยนเส้นทาง stdout เพื่อ syslog ได้ดี แต่ stderr มาถึงคอนโซลดังนั้นฉันต้องปรับแต่งคำสั่ง


คำตอบ:


30

คุณจะต้องรวมการส่งออกของ STDERR และ STDOUT loggerก่อนที่จะมีท่อมัน ลองใช้สิ่งนี้แทน:

/home/dirname/application_name -v 2>&1 | logger &

ตัวอย่าง

$ echo "hi" 2>&1 | logger &
[1] 26818
[1]+  Done                    echo "hi" 2>&1 | logger

$ sudo tail /var/log/messages
Apr 12 17:53:57 greeneggs saml: hi

คุณสามารถใช้สัญกรณ์ตัวย่อได้ที่นี่เช่นกันหากใช้อย่างระมัดระวังในเปลือก Bash จริง (เพื่อไม่ให้สับสนกับ Dash):

$ echo "hi" |& logger &

หมายเหตุ:<cmd1> 2>&1 | <cmd2>นี้จะเทียบเท่ากับ ใช้ข้างต้นอีกครั้งเมื่อใช้ Bash shell จริงเท่านั้นการโต้ตอบจะเป็นวิธีที่ดีในการเข้าถึง

ตัดตอนมาจากABSG

# | & ถูกเพิ่มใน Bash 4 เป็นตัวย่อสำหรับ 2> & 1 |

อ้างอิง


2
slm ไม่มีความผิดใด ๆ แต่รูปแบบหลังคือการใช้ความรุนแรงในทางที่ผิด จำนวนของการจดชวเลขที่ไม่จำเป็นเช่นนั้นอาจทำให้ไม่คุ้มค่าที่จะได้รับเพียงเล็กน้อยจากการใช้งาน ตัวอย่างเช่นแม้เพียงแค่ในเครื่องของคุณเองถ้าคุณใส่ข้างบนในสคริปต์และdashพยายามที่จะรันสคริปต์ที่บูตเท่านั้นที่จะล้มเหลวและท้องที่กระบวนการบูตของคุณ ... ดี ... เมื่อมีการกล่าวถึงไวยากรณ์ดังกล่าวควร อยู่ในบริบทของเชลล์เชิงโต้ตอบเท่านั้นหรืออย่างน้อยนั่นคือความคิดเห็นของฉัน
mikeserv

@mikeserv - ไม่มีการกระทำผิด 8-) ฉันรวมสิ่งเหล่านี้เนื่องจากพวกเขาอยู่ในคู่มือ ABSG ฉันสันนิษฐาน (อาจไม่ถูกต้อง) ว่า OP ใช้ Bash ตั้งแต่พวกเขาแสดง2>&1แต่คำเตือนของคุณค่อนข้างฉลาดเนื่องจากตัวอย่างเกี่ยวข้องกับ startups ฉันจะทำให้คำแนะนำหลังเหล่านั้นเด่นชัดขึ้นโดยมีคำเตือนว่ามันมีไว้สำหรับการโต้ตอบเท่านั้นเปลือกหอย
slm

@mikeserv - ไม่แนะนำเสียง โดยทั่วไปฉันไม่ได้ใช้ Dash หรือแม้แต่ Ubuntu ดังนั้นฉันจึงไม่สนใจปัญหาเหล่านี้ แต่พวกเขายังคงเป็นของจริงและเป็นสิ่งที่ดีที่จะชี้ให้พวกเขาทราบตั้งแต่ Ubuntu / Debian / Dash น่าจะเป็นสถานการณ์ทั่วไป
slm

ฉันไม่ได้ใช้เดเบียนเหมือนกัน แต่ฉันก็เริ่มตระหนักว่าหลายคนทำมากขึ้นเรื่อย ๆ ฉันใช้dashมัน - มันเร็วจริง ๆ
mikeserv

1
นั่นอาจไม่จำเป็น - คุณไม่สามารถพิมพ์เร็วพอสำหรับสร้างความแตกต่างในเชลล์แบบโต้ตอบ - ซึ่งฉันใช้ zsh แต่สำหรับสคริปนั้นจะเร็วกว่าคนอื่น ๆ ที่ฉันเคยลองมา
mikeserv
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.