การรันโปรแกรมในพื้นหลังจากเทอร์มินัล


136

ฉันจะรันโปรแกรมในพื้นหลังของเชลล์ด้วยความสามารถในการปิดเชลล์ในขณะที่ปล่อยให้โปรแกรมทำงานอยู่ได้อย่างไร ให้บอกว่า UI ของฉันมีปัญหาหรือด้วยเหตุผลบางอย่างฉันต้องบูตโปรแกรมจากหน้าต่างเทอร์มินัลพูดnm-applet:

nm-applet

เมื่อเริ่มต้นมันจะอยู่ด้านหน้าของหน้าต่างเทอร์มินัล

มีวิธีง่าย ๆ ในการรันโปรแกรมในพื้นหลังโดยไม่จำเป็นต้องเปิดเครื่องเทอร์มินัลหรือมีเครื่องเทอร์มินัลทั้งหมดหรือไม่?

ในบันทึกย่อนั้นฉันหาวิธีเรียกใช้โปรแกรมจากเทอร์มินัลและอนุญาตให้มีอินพุตอื่นโดยต่อท้ายเครื่องหมายแอมเปอร์แซนด์ ( &) เข้ากับคำสั่งดังนี้:

nm-applet &

แต่สิ่งนี้ไม่ได้ใช้งานมากนักเนื่องจากกระบวนการใด ๆ ที่เริ่มต้นในเทอร์มินัลถูกฆ่าเมื่อเทอร์มินัลถูกปิด                                                                        


7
nohup 'command' & ทำงานได้ดี มีปัญหาอะไรไหม?
ทั่วไป

คำตอบ:


173

ฉันได้มาเมื่อเร็ว ๆ setsidนี้ที่ชอบ มันเริ่มต้นดูเหมือนว่าคุณกำลังเรียกใช้บางสิ่งบางอย่างจากเทอร์มินัล แต่คุณสามารถตัดการเชื่อมต่อ (ปิดเทอร์มินัล) และมันก็ดำเนินต่อไป

นี่เป็นเพราะคำสั่งแยกออกจริงและในขณะที่อินพุตเข้ามาที่เทอร์มินัลปัจจุบันมันเป็นเจ้าของโดยผู้ปกครองที่แตกต่างกันอย่างสมบูรณ์ (ที่ยังมีชีวิตอยู่หลังจากที่คุณปิดสถานี)

ตัวอย่าง:

setsid gnome-calculator

ฉันยังค่อนข้างบางส่วนdisownซึ่งสามารถใช้ในการแยกกระบวนการจากต้นไม้ปัจจุบัน คุณใช้ร่วมกับเครื่องหมายและพื้นหลัง:

gnome-calculator & disown

ฉันเพิ่งเรียนรู้เกี่ยวกับการวางไข่ subshells ด้วยวงเล็บ วิธีการง่ายๆนี้ใช้ได้ผล:

(gnome-calculator &)

และแน่นอนมีnohupตามที่คุณพูดถึง ฉันไม่ได้คลั่งไคล้nohupเพราะมีแนวโน้มที่จะเขียนถึง~/nohup.outโดยที่ฉันไม่ขอให้ทำ หากคุณเชื่อในสิ่งนั้นอาจเป็นเพราะคุณ

nohup gnome-calculator

และสำหรับกระบวนการระยะยาวมีสิ่งต่าง ๆ เช่นscreenและเทอร์มินัลเสมือน -xux อื่น ๆ ที่ช่วยให้เซสชันมีชีวิตระหว่างการเชื่อมต่อ สิ่งเหล่านี้อาจไม่ได้มีผลกับคุณเพราะคุณเพียงแค่ต้องการเข้าถึงเทอร์มินัลเอาท์พุทชั่วคราว แต่ถ้าคุณต้องการย้อนเวลากลับไปในภายหลังและดูกิจกรรมเทอร์มินัลล่าสุดหน้าจออาจเป็นตัวเลือกที่ดีที่สุด

อินเทอร์เน็ตเต็มไปด้วยscreenแบบฝึกหัด แต่นี่เป็นการเริ่มต้นอย่างง่าย ๆ :


Oli, ในกรณีของDISPLAY =: 0 unity --replaceคุณจะใช้ข้อใดข้างบนและทำไม?
บ๊องเกี่ยวกับ natty

4
@nuttyaboutnatty หุ้มทั้งล็อตในเซสชันเชลล์ของตัวเอง: sh -c "sleep 10s && cvlc '/home/omm.ogg'" & disown. นั่นเป็นวิธีแก้ปัญหาของฉันสำหรับทุกสิ่งที่จะทำให้แน่ใจว่ามันจะออกอย่างเหมาะสม
Oli

1
@ nuttyaboutnatty นั่นคือสิ่งที่ฉันหมายถึง แต่คุณจะไม่จบลงด้วยสองอินสแตนซ์ที่ทำงานเพราะ--replaceมันดูเหมือนและสิ้นสุดอินสแตนซ์เก่าจริง ๆ การรันเป็นครั้งที่สองจากภายใน xsession จะสิ้นสุดการคัดลอกที่ผูกไว้กับ TTYn และจะช่วยให้คุณใช้มันในอนาคตหากคุณต้องการมัน อาจมีวิธีที่ดีกว่าในการทำ แต่สิ่งที่อยู่ในใจของฉันทุกครั้งที่ฉันต้องการมัน
Oli

1
สมบูรณ์แบบสิ่งที่ได้ผลสำหรับฉันก็คือ 'subshell' (gnome-calculator &) ' ฉันใช้มันเพื่อเปิดแอพคอนโซลโมโนในพื้นหลัง ด้วยเทคนิคอื่น ๆ แอพโมโนจะพังทันที
Nikolaos Georgiou

2
หมายเหตุสำหรับผู้ใช้ในอนาคต : การสร้างnohup.outสามารถระงับได้ด้วยการเปลี่ยนเส้นทางทั้ง stdout และ sterr ไป/dev/nullเช่น:nohup firefox &> /dev/null &
Sergiy Kolodyazhnyy

55

นี่คือสองวิธีที่ฉันจะไปด้วย ประการแรกไม่ได้เรียกใช้จากเทอร์มินัล กดAlt+ F2เพื่อเปิดกล่องโต้ตอบเรียกใช้แล้วเรียกใช้จากที่นั่น (ไม่มี &)

จากเทอร์มินัลรัน

nm-applet &

แต่อย่าปิดสถานีด้วยตัวเอง นั่นคืออย่ากดปุ่ม X เพื่อปิดและอย่าใช้ไฟล์ -> ออกจากแถบเมนู ถ้าคุณปิดเทอร์มินัลด้วยวิธีนั้นมันจะส่งสัญญาณ HUP (วางสาย) ไปที่ bash ที่กำลังทำงานอยู่ภายในซึ่งจะส่งสัญญาณ HUP ให้กับลูก ๆ ของมันทั้งหมด (ซึ่งเป็นสาเหตุที่ nohup ทำงานในกรณีนี้)

ให้ออกจากเชลล์โดยรันexitหรือกดปุ่มCtrl+ Dแทน bash จะทำการแยกลูก ๆ ออกจากนั้นออกจากกระบวนการทำงานพื้นหลังที่ยังทำงานอยู่ และเมื่อ bash ออกจากเครื่องเทอร์มินัลก็สูญเสียกระบวนการลูกของมันดังนั้นมันจึงปิดเช่นกัน

ทำมันทั้งหมดในครั้งเดียว:

nm-applet & exit

ที่น่าตื่นตาตื่นใจ! ไม่เคยรู้เลยและคุณดูเหมือนจะเป็นคนเดียวที่พูดถึงเรื่องนี้ เป็นวิธีที่ฉันชอบที่สุดเมื่ออยู่ในสภาพแวดล้อมเดสก์ทอป เสียดายที่ฉันไม่สามารถ
โหวต

ฉันลองสิ่งนี้ด้วยแอปพลิเคชั่นอื่นและมันล้มเหลว: matlab & exitทำงานเป็นสองคำสั่งแยกกันทำงานได้ดี:matlab & exit
MattKelly

ฉันสงสัยว่าทำไม OP กล่าวว่าการปิด Terminal ทำให้โปรแกรมพื้นหลังของเขาขัดข้อง ฉันไม่เคยลองปิดเทอร์มินัลด้วยปุ่ม "x" บนหน้าต่าง
user1717828

ปุ่ม x ฆ่าไม่ออกอย่างสมบูรณ์คำสั่ง exit ทำ คุณสามารถทำการแมปปุ่ม x เพื่อคำสั่งออกจากแทน ...
ทิมเบเกอร์

14

คุณสามารถวิ่งได้

nohup nm-applet &  

เพื่อละเว้นสัญญาณสิ้นสุดเมื่อปิดเครื่อง ไม่มีปัญหากับเรื่องนั้น


ทางเลือกอื่น ๆ ? เพียงเพื่อประโยชน์ Knowings ไม่ได้สำหรับสิ่งอื่น
Overtone

ที่ wikipedia ( en.wikipedia.org/wiki/Nohup ) มีคำแนะนำให้ใช้echo command | at nowซึ่งฉันไม่สามารถใช้งานได้
desgua

2
ฉันสงสัยว่ามันทำงานอย่างไรจาก UI เมื่อคุณดับเบิลคลิกที่ไอคอนหรือโปรแกรม
รวม

execจัดเตรียมทางเลือกnohup <command> &สำหรับการรันโปรเซสในพื้นหลังและส่งคืนพร้อมต์เชลล์ปัจจุบัน
JSStuball

12

สิ่งหนึ่งที่คำตอบอื่น ๆ หายไปคือวิธีแยกกระบวนการทำงานที่บล็อกเปลือกออกในปัจจุบัน ในเทอร์มินัลและเชลล์ส่วนใหญ่Ctrl+ Zจะหยุดกระบวนการทำงานและนำคุณกลับไปที่พรอมต์อินพุต จากนั้นคุณสามารถออก

bg

เพื่อส่งกระบวนการที่กำลังรันไปยังพื้นหลัง ปัญหา

fg

แทนที่จะนำกระบวนการที่กำลังรันกลับสู่เบื้องหน้าแทน

แก้ไข : รายละเอียดเพิ่มเติมในคำตอบนี้ฉันค้นพบในภายหลัง


7

ใช้(exec PROGRAM &> /dev/null & )ในการอนุญาตให้ PID ของ subshell PROGRAMจะต้องดำเนินการไปโดย ฉันได้ทดสอบวิธีการนี้หลายครั้งด้วยหลาย ๆ โปรแกรม การปิดเทอร์มินัลดั้งเดิมจะไม่มีผลกับโปรแกรมที่เพิ่งวางใหม่

การสาธิตขนาดเล็ก:

$ # this is before running
$ (exec firefox &> /dev/null &)
$ # and look, we still in side the terminal and can continue working

Hmmm (exec firefox)แฮงค์เทอร์มินัลจนกว่าฉันจะออกจาก Firefox ... และปิดเทอร์มินัล SIGHUPs เชลล์และ subshell
kos

ฉันแก้ไขคำตอบของฉันแล้ว ทดสอบกับโปรแกรมอื่น ๆ ฉันไม่ได้สังเกต Firefox หรือโปรแกรมอื่น ๆ ที่แขวนขั้วควบคุมในรุ่นนี้
Sergiy Kolodyazhnyy

ทำงานได้ดีสำหรับฉัน
Zanna

ฉันไม่เชื่อว่าจำเป็นต้องใช้ exec ของ bash มันอาจเป็นไปได้ว่าคุณต้องการ PID ด้วยเหตุผลบางอย่าง
marinara

2

ฉันสามารถแนะนำสถานี byobu คุณสามารถแยกกระบวนการของคุณได้อย่างง่ายดายโดยกดปุ่ม F6


1

แม้ว่าจะมีคำตอบที่ดีข้างต้น แต่ฉันต้องการให้ 2 เซ็นต์ของฉันเกี่ยวกับวิธีการใช้ MATLAB ในพื้นหลัง

sudo -b matlab

-bแท็กของ sudo สามารถเรียกใช้โปรแกรมในพื้นหลัง คุณยังสามารถปิดเทอร์มินัลได้หลังจากดำเนินการคำสั่งนี้

อาจไม่เกี่ยวข้อง แต่มีเว็บไซต์ที่ยอดเยี่ยมที่คุณสามารถใช้เพื่ออธิบายคำสั่งเชลล์ http://explainshell.com/explain/8/sudo


0

ฉันไม่รู้ว่ามันเป็นวิธีที่ถูกต้อง แต่ฉันเพิ่งเริ่มต้นเซสชั่นอื่นในขณะที่ออกจากก่อนหน้านี้ allone ตัวอย่างเช่นฉันรันเว็บเซิร์ฟเวอร์อย่างง่ายบนราสเบอร์รี่ของฉัน web.py หนึ่งอัน จากนั้นฉันจะเริ่มเซสชันใหม่ในขณะที่ทิ้งไว้คนเดียว แค่นั้นแหละ. นอกจากนี้ยังมีประโยชน์เนื่องจากคุณยังได้รับการอัปเดตแม้ว่าคุณจะทำงานในเซสชันอื่น


2
ยินดีต้อนรับสู่ถาม Ubuntu! ฉันขอแนะนำให้แก้ไขคำตอบนี้เพื่อขยายด้วยรายละเอียดเฉพาะเกี่ยวกับวิธีการทำเช่นนี้ (ดูเพิ่มเติมฉันจะเขียนคำตอบที่ดีได้อย่างไรสำหรับคำแนะนำทั่วไปเกี่ยวกับคำตอบประเภทใดที่ถือว่ามีค่ามากที่สุดใน Ask Ubuntu)
David Foerster

0

ในกรณีที่ใช้ KDE คุณสามารถใช้kstartซึ่งจะเริ่มโปรแกรมแยกออกจากเทอร์มินัล นอกจากนี้ยังตรวจสอบให้แน่ใจว่าสภาพแวดล้อม KDE นั้นตั้งค่าไว้อย่างถูกต้องสำหรับคำสั่ง (ดูkstart.cppซอร์สโค้ดสำหรับการอ้างอิงตามที่คุณเห็นจากที่นั่นจะใช้KProcess::startDetachedและKProcessมาจากQProcessและstartDetachedเริ่มกระบวนการใหม่และแยกออกจากมัน)

ที่คล้ายกันนี้ยังมีkde-openหรือหรือxdg-opengnome-open


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