ฉันโพสต์คำตอบไปยังเธรดที่เก่ากว่าของหัวข้อที่คล้ายกันพร้อมคำตอบจากแหล่งต่าง ๆ ต่อไปนี้เป็นสำเนาของคำตอบที่ดัดแปลงสำหรับเธรดนี้
ผลงานดังต่อไปนี้:
$ (gui_app &> /dev/null &)
นี่คือคำตอบของ Nathan Fellman พร้อมการเปลี่ยนเส้นทาง
"&> / dev / null" จะเปลี่ยนเส้นทางทั้ง stdout และ stderr ไปยังอุปกรณ์ null เครื่องหมายสุดท้ายและทำให้กระบวนการทำงานในพื้นหลัง วงเล็บรอบคำสั่งจะทำให้ "gui_app" ของคุณทำงานใน subshell
การทำเช่นนี้จะแยกกระบวนการ "gui_app" ออกจากคอนโซลที่คุณเรียกใช้คำสั่งนี้ ดังนั้นแม้ว่าคุณจะปิดหน้าต่างเทอร์มินัลเทอร์มินัลอีมูเลเตอร์กำลังทำงานอยู่ "gui_app" จะไม่ปิด ฉันวิ่งแล้วดูที่แผนผังกระบวนการด้วยคำสั่ง "pstree" และพบว่าแอปพลิเคชันเริ่มต้นด้วยวิธีนี้จะกลายเป็นกระบวนการลูกเพื่อ "init"
ตัวอย่างเช่น,
$ gui_app &> /dev/null &
จะเรียกใช้แอปพลิเคชันในพื้นหลัง แต่มันจะกลายเป็นกระบวนการลูกของกระบวนการคอนโซลและจะยุติลงเมื่อคุณปิดเทอร์มินัล (แม้ว่าการออกจากเทอร์มินัลผ่าน bash โดยใช้คำสั่ง exit หรือ Ctrl-D จะทำให้ bash ล้างข้อมูลโดยส่งกระบวนการเบื้องหลังเพื่อเริ่มต้น)
"nohup" ทำงานตามที่ NawaMan แนะนำ แต่การเปลี่ยนเส้นทางเอาต์พุตและข้อผิดพลาดไปยังไฟล์เป็นค่าเริ่มต้น ดังที่ JeffG ได้ตอบคำสั่ง "ปฏิเสธ" (หากมีอยู่ในเชลล์) สามารถแยกกระบวนการออกจากเทอร์มินัลหลังจากที่คุณเริ่มกระบวนการพื้นหลัง:
$ gui_app &
$ disown
(BTW ทั้งหมดนี้ใช้กับ bash ฉันแน่ใจว่า shell อื่นมีเมธอด / ไวยากรณ์อื่นสำหรับการทำเช่นนี้)
การอ้างอิงบางส่วน: การ
แยกกระบวนการ (เครื่องมือไฟฟ้า UNIX)
หากเป็นการเรียกง่ายๆไปยังแอปพลิเคชัน GUI - โดยไม่มีตัวเลือกที่ซับซ้อนและดูเหมือนว่าการใช้ตัวเรียกใช้งานเช่น "gmrun" หรือdmenu (คำเตือน: เสียงดัง) ก็เป็นตัวเลือกที่ดีเช่นกัน ผูกไว้กับคีย์ผสม ฉันยังไม่ได้ใช้ตัวเรียกใช้ แต่ได้ลองทั้งสองตัวแล้ว
หมายเหตุ: CarlF ในข้อคิดเห็นของเธรดอื่นรายงานแอป GUI ที่เริ่มต้นด้วยวิธี "gui_app &" ไม่ปิดเมื่อเขาออกจากเทอร์มินัลหลัก ฉันคิดว่าเรากำลังปิดเครื่องด้วยวิธีที่ต่างกัน ฉันกำลังปิดหน้าต่างที่เทอร์มินัลอีมูเลเตอร์กำลังทำงานอยู่ฉันคิดว่าเขาอาจออกจากเทอร์มินัลอีมูเลเตอร์ผ่านเชลล์ (คำสั่ง exit หรือ Ctrl-D) ฉันทดสอบและเห็นว่าการออกจาก bash ไม่ได้หยุด GUI เริ่มต้นเนื่องจากกระบวนการพื้นหลังของเทอร์มินัลเช่นเดียวกับ CarlF กล่าว ดูเหมือนจะทุบตีกระบวนการพื้นหลังเพื่อเริ่มต้นเมื่อได้รับโอกาสในการทำความสะอาด ในความเป็นจริงนี้จะต้องเป็นกลไกที่กระบวนการพื้นหลังเริ่มต้นใน subshell ได้รับการส่งมอบให้ init