จากman nohup
:
หากอินพุตมาตรฐานคือเทอร์มินัลให้เปลี่ยนเส้นทางจาก / dev / null ถ้าออกมาตรฐานเป็นขั้วผนวกส่งออกไป nohup.out
ถ้าเป็นไปได้$HOME/nohup.out
มิฉะนั้น หากข้อผิดพลาดมาตรฐานคือเทอร์มินัลให้เปลี่ยนเส้นทางไปยังเอาต์พุตมาตรฐาน nohup COMMAND > FILE
ในการบันทึกการส่งออกไปยังไฟล์ที่ใช้
(แก้ไขอย่างสมบูรณ์ตามความคิดเห็น)
เมื่อออกจากเชลล์หรือปิดเทอร์มินัลกระบวนการลูกจะถูกส่ง SIGHUP (hangup ชื่อมาจากเวลาที่เทอร์มินัลจะโทรเข้าคอมพิวเตอร์ UNIX) เพื่อบอกพวกเขาว่าเทอร์มินัลนั้นไม่มี เชื่อมต่ออีกต่อไป นอกจากนี้เมื่อกระบวนการเชลล์สิ้นสุดลงสตรีม stdin, stdout และ stderr ของกระบวนการเด็กจะถูกปิด โดยปกติสิ่งนี้ทำให้กระบวนการเด็กตาย โดยปกติแล้วสิ่งนี้เป็นสิ่งที่ดีเพราะจะช่วยให้กระบวนการไม่ทำงานโดยไม่มีผู้ใช้
วัตถุประสงค์ของnohup
โปรแกรมคือการทำให้กระบวนการทำงานต่อไปแม้หลังจากที่เชลล์ยกเลิกและเทอร์มินัลยกเลิกการเชื่อมต่อ เช่นนี้การควบคุมทิศทางเอาต์พุตไปยังเทอร์มินัลก็เอาชนะวัตถุประสงค์อย่างสมบูรณ์ คำตอบดั้งเดิมของฉัน ( nohup COMMAND | cat
) ไม่เป็นประโยชน์เพราะ: เมื่อปิดเทอร์มินัลเอาต์พุตของแมวจะปิดและแมวก็ตายซึ่งแบ่งท่อและส่ง SIGPIPE ไปยังกระบวนการ nohup ทำให้มันตาย ฉันตอบคำถามโดยไม่คิดถึงจุดประสงค์
เพื่อให้บรรลุวัตถุประสงค์ของคุณให้เรียกใช้nohup COMMAND > FILE
เพื่อเลือกชื่อของไฟล์เพื่อส่งออกโดยตรง จากนั้นใช้tail -f FILE
เพื่อดูผลลัพธ์บนเทอร์มินัล
ในทำนองเดียวกันเราสามารถใช้COMMAND >FILE 2>&1 </dev/null &
คำสั่งshell ต่อไปนี้เพื่อรันคำสั่งที่ stdio stream ไม่ได้เชื่อมต่อกับเทอร์มินัลและสามารถทำงานต่อหลังจากปิดเทอร์มินัลแล้ว นอกจากนี้ใน zsh ให้รัน shell-builtin disown
เพื่อบอก zsh ให้ออกจากกระบวนการแทนที่จะฆ่ามันเมื่อเชลล์สิ้นสุด