ผมมีโปรแกรมที่ก่อให้ข้อมูลที่เป็นประโยชน์ในแต่ยังอ่านจากstdout
stdin
ฉันต้องการเปลี่ยนเส้นทางเอาต์พุตมาตรฐานไปยังไฟล์โดยไม่ต้องให้อะไรกับอินพุตมาตรฐาน จนถึงตอนนี้ดีมาก: ฉันทำได้:
program > output
และไม่ทำอะไรเลยใน tty
อย่างไรก็ตามปัญหาคือฉันต้องการทำในพื้นหลัง ถ้าฉันทำ:
program > output &
โปรแกรมจะถูกระงับ ("ถูกระงับ (อินพุต tty)")
ถ้าฉันทำ:
program < /dev/null > output &
โปรแกรมหยุดทำงานทันทีเนื่องจากถึง EOF
ดูเหมือนว่าสิ่งที่ฉันต้องการก็คือการเข้าไปในท่อสิ่งที่ไม่ได้ทำอะไรสำหรับจำนวนเงินที่แน่นอนของเวลาและไม่ได้อ่านprogram
stdin
แนวทางต่อไปนี้ใช้ได้ผล:
while true; do sleep 100; done | program > output &
mkfifo fifo && cat fifo | program > output &
tail -f /dev/null | program > output &
อย่างไรก็ตามทั้งหมดนี้น่าเกลียดมาก มีมีจะเป็นวิธีที่สง่างามใช้สาธารณูปโภค Unix มาตรฐานเพื่อ "ทำอะไรไปเรื่อย ๆ" (ถอดความman true
) ฉันจะบรรลุสิ่งนี้ได้อย่างไร (เกณฑ์หลักของฉันสำหรับความสง่างามที่นี่: ไม่มีไฟล์ชั่วคราวไม่มีการรอไม่ว่างหรือการปลุกเป็นระยะ ๆ ไม่มีสาธารณูปโภคแปลกใหม่สั้นที่สุดเท่าที่จะทำได้)
su -c 'while true; do true; done | cat > ~/output &' user
?
1<&-
มันจะออกจากโปรแกรมของคุณ?
su -c 'program | output &' user
ดู ฉันกำลังจะถามคำถามที่คล้ายกันกับการสร้างงานพื้นหลังเป็นวิธีที่ยอมรับได้สำหรับการจัดการ "บริการ / ภูต" ฉันยังพบว่าฉันไม่สามารถเปลี่ยนเส้นทางโดยไม่ได้เปลี่ยนเส้นทางSTDERR
STDOUT
วิธีแก้ปัญหาที่ programA ส่งSTDOUT
ไปยังSTDIN
ของ programB จากนั้นเปลี่ยนเส้นทางSTDERR
ไปยังล็อกไฟล์:programA 2> /var/log/programA.log | programB 2> /var/log/programB.log 1> /dev/null