ฉันจะปิดเทอร์มินัลโดยไม่ฆ่าลูก ๆ ของมันได้อย่างไร


35

บางครั้งฉันเรียกใช้แอปใน gnome-terminal แต่ทันใดนั้นฉันต้องรีสตาร์ท gnome หรือบางอย่าง ฉันเดาว่าคำตอบสำหรับคำถามนั้นมีประโยชน์แล้วฉันต้องการตัดการเชื่อมต่อจาก SSH ซึ่งมีบางอย่างเกิดขึ้น

แผนผังต้นไม้ของ Gnome มีลักษณะเช่นนี้:

gnome-terminal
    bash
        some-boring-process

ฉันสามารถ 'แยก' ออกbashจากgnome-terminal(หรือแยกออกsome-boring-processจากการทุบตีและเปลี่ยนเส้นทางผลลัพธ์ของมันไปที่อื่นได้หรือไม่) ถ้าฉันเพิ่งฆ่าgnome-terminalมันbashจะถูกฆ่าเพื่อกระบวนการย่อยทั้งหมดของมัน


คำตอบ:


48

หากsome-boring-processกำลังทำงานในเซสชั่นทุบตีปัจจุบันของคุณ:

  1. หยุดด้วยctrl-zการให้ bash พรอมต์คุณ
  2. วางไว้ในพื้นหลังด้วย bg
  3. จดบันทึกหมายเลขงานหรือใช้jobsคำสั่ง
  4. แยกกระบวนการออกจากเซสชัน bash นี้ด้วยdisown -h %1(แทนที่หมายเลขงานจริงที่นั่น)

แต่นั่นไม่ได้ทำอะไรเพื่อเปลี่ยนเส้นทางผลลัพธ์ - คุณต้องคิดเมื่อคุณเริ่มกระบวนการที่น่าเบื่อ [แก้ไข] ดูเหมือนว่าจะมีวิธีในการเปลี่ยนเส้นทางhttps://gist.github.com/782263

แต่จริงจังดูที่หน้าจอ ฉันมีเชลล์บนเซิร์ฟเวอร์ระยะไกลที่ทำงานมาหลายเดือน


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

คุณไม่ได้ใช้มันสำหรับทุกเซสชัน bash แต่สำหรับทุกเครื่องระยะไกลที่คุณใช้เวลามาก
เกล็นแจ็คแมน

ฉันใช้เสรีภาพในการเพิ่มข้อมูลเกี่ยวกับการเปลี่ยนเส้นทางผลลัพธ์โปรดตรวจสอบ!
valya

[root @ server ~] # bg -bash: bg: ปัจจุบัน: ไม่มีงานดังกล่าว
Muhammad Dyas Yaskur

ทำไมฉันถึงได้bash: bg: current: no such job?
Muhammad Dyas Yaskur

10

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


ขอบคุณ แต่เนื่องจากที่ฉันแสดงความคิดเห็นต่อคำตอบที่ยอมรับ: 1. คำถามเกี่ยวกับกระบวนการที่กำลังดำเนินอยู่ 2. screenมีปัญหาและฉันไม่รู้สึกอยากใช้มันสำหรับการทุบตีทุกครั้งในชีวิตของฉัน
valya

6

screen, tmuxหรือdtach(อาจจะมีdvtm) ทั้งหมดที่ดีสำหรับการนี้ nohupแต่ถ้าบางสิ่งบางอย่างมันที่คุณไม่คิดจะใช้อย่างใดอย่างหนึ่งที่คุณอาจจะสามารถใช้ประโยชน์จาก


ขอบคุณ แต่เนื่องจากที่ฉันแสดงความคิดเห็นต่อคำตอบที่ยอมรับ: 1. คำถามเกี่ยวกับกระบวนการที่กำลังดำเนินอยู่ 2. screenมีปัญหาและฉันไม่รู้สึกอยากใช้มันสำหรับการทุบตีทุกครั้งในชีวิตของฉัน
valya

@valya ดีใจที่คุณพบวิธีแก้ปัญหา แต่เพื่อให้ชัดเจนว่าnohupทำงานกับกระบวนการที่ทำงานอยู่โดยใช้-pตัวเลือก (ถ้ามี)
Hank Gay

@ แฮงค์เกย์: ฉันไม่เห็น-pตัวเลือกnohupในหน้าคู่มือ คุณใช้ระบบอะไร
Mikel

@Mikel ก่อนที่ฉันจะเรียนรู้ที่จะหยุดกังวลและรักtmuxฉันใช้-pตัวเลือกในกล่อง Solaris ฉันยังมีความทรงจำที่คลุมเครือในการทำมันบนกล่อง CentOS mongrel (อาจzshมี builtin ที่รองรับหรือไม่) แต่ฉันไม่พบเอกสารใด ๆ
แฮงค์ Gay

@Hank เกย์: ทั้งbashมิได้zshในระบบ Ubuntu Linux nohupของฉันให้
Mikel

4

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

อย่างไรก็ตามมันทำสิ่งที่น่ากลัวรวมถึงการติดรหัสแอสเซมบลีบางส่วนลงบนสแต็กของแอปพลิเคชันที่แนบใหม่ และรหัสนั้นยังไม่ได้รับการอัพเดตสำหรับ x86_64

มีอีกโปรแกรมหนึ่งที่ใช้วิธีที่ดีกว่านั้นคือการแช่แข็งกระบวนการในพื้นที่ผู้ใช้ไปยังไฟล์ซึ่งจะสามารถกู้คืนได้ในภายหลัง (อาจเป็นใน tty อื่น) นี่คือcryopidและโครงการนั้นก็ดูเหมือนว่าจะหยุดใน ขั้นตอนการพิสูจน์แนวคิดและไม่ทำงานกับ Linux ที่ทันสมัยเนื่องจากรหัสย่อมาจาก อ่า

แค่คิดว่านี่ควรจะอยู่ที่นี่เพื่อความสมบูรณ์ หากคุณไม่สนใจที่จะใช้ลัทธิวูดูที่น่ากลัวนี่เป็นเรื่องที่เป็นไปได้ - อย่างน้อยก็มีความเป็นไปได้ทางทฤษฎี


1
ที่ทำให้ฉันนึกถึงgist.github.com/782263 ... โอ้แกสต์นั้นดูเหมือนจะตอบคำถามของฉันด้วย
valya

2

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

ฉันจะใช้screenเมื่อฉันต้องการที่จะสามารถสลับขั้วสำหรับกระบวนการ เช่นการเริ่มต้นกระบวนการจากที่บ้าน / ที่ทำงานและสลับไปที่อื่น ๆ เช่นเดียวกับผลลัพธ์เซสชันเทอร์มินัลอื่น ๆ ในที่สุดจะเลื่อนออกจากด้านบนของบัฟเฟอร์

แก้ไข: ถ้าคุณได้เปิดตัวกระบวนการคุณสามารถdisownกระบวนการเพื่อป้องกันHUPสัญญาณจากการถูกส่งเมื่อกระบวนการปิด


ขอบคุณ แต่เนื่องจากที่ฉันแสดงความคิดเห็นต่อคำตอบที่ยอมรับ: 1. คำถามเกี่ยวกับกระบวนการที่กำลังดำเนินอยู่ 2. screenมีปัญหาและฉันไม่รู้สึกอยากใช้มันสำหรับการทุบตีทุกครั้งในชีวิตของฉัน
valya

@valya ฉันได้เห็นการอ้างอิงถึงการยกเลิกการเชื่อมต่อกระบวนการทำงานจากกลุ่มโปรแกรม ฉันไม่รู้เครื่องมือที่จะทำเช่นนั้น เครื่องมือน่าจะต้องเปลี่ยนเส้นทางช่อง std IO ด้วยเช่นกัน ฉันคิดว่าฉันอาจจะทำให้มันทำงานได้หนึ่งครั้ง แต่การตัดสินใจว่า nohup นั้นง่ายกว่า
BillThor

1

คุณสามารถสร้างโปรเซส (PID) ไม่ได้รับสัญญาณ HUP เมื่อสิ้นสุดเซสชันเทอร์มินัล ใช้คำสั่งต่อไปนี้:

nohup -p PID

nohup: invalid option -- 'p'. คุณใช้ระบบเวอร์ชันใดnohupอยู่
Anthon

ฉันส่วนใหญ่ใช้ Solaris และ AIX สำหรับ Linux คุณควรตรวจสอบคำสั่ง disown
โทนี่

ใช่ไม่มี-pตัวเลือกบน Linux ดังนั้นคำตอบนี้คือเฉพาะ Solaris และ AIX เป็นการดีที่ควรทราบ
Sergiy Kolodyazhnyy

1

สคริปต์นี้แยกกระบวนการลูกจาก parent และกำหนดให้กระบวนการเริ่มต้น :

toDetach=$1

./$toDetach & # Runs the process - script on background

disown -h %$(jobs -l | grep $(ps -A | grep $toDetach | cut --delimiter=' ' -f1) | cut --delimiter=' ' -f1 | tr -d '[]+') # and then disowns it from parents process
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.