ย้ายโปรแกรมที่เริ่มต้นในหน้าจอ GNU ออกไปยังเทอร์มินัลอื่น


21

ฉันต้องการที่จะยุติอินสแตนซ์ของ GNU screenในขณะที่รักษากระบวนการทำงานอยู่ภายใน

ดังนั้นฉันจึงเปิดโปรแกรมเทอร์มินัลอีมูเลเตอร์ปกติของฉันและดำเนินการหน้าจอ จากนั้นผมใช้อินสแตนซ์ที่ที่จะดำเนินการscreen ./script_x.shตอนนี้ไม่ว่าด้วยเหตุผลใดฉันต้องการเลิกใช้screenแต่ก็script_x.shยังทำงานไม่เสร็จและฉันไม่เต็มใจที่จะสละความก้าวหน้าของฉัน

ฉันสามารถทำให้กระบวนการที่ใช้งานยังมีชีวิตอยู่เพื่อที่จะสามารถทำงานต่อไปได้ภายในตัวจำลองเทอร์มินัลปกติของฉันหรือไม่?


14
คุณต้องการที่จะฆ่าหน้าจอหรือคุณต้องการที่จะแยกออกจากมัน? หน้าจอมีไว้เพื่อใช้สำหรับการเรียกใช้กระบวนการในพื้นหลังเพื่อให้คุณสามารถดำเนินการต่อในเซสชั่นปกติของคุณนอกจากนี้ยังอนุญาตให้แอปทำงานต่อไปหลังจากที่คุณออกจากระบบ (เช่นตัดการเชื่อมต่อเซสชัน SSH ของคุณ) คุณสามารถแยกออกจากหน้าจอดำเนินการต่อในเซสชั่นปกติและรถกระบะที่คุณได้ทิ้งไว้ในเซสชั่นหน้าจอ เทอร์มินัลอีมูเลเตอร์ของคุณไม่มีส่วนเกี่ยวข้องกับสิ่งนี้
BlueCacti

หรือเพียงแค่สร้างหน้าจออื่นภายในscreenเซสชัน
chrylis -on strike-

11
คำถามนี้มีกลิ่นเหมือนปัญหา XY
คริสดิจิตอล

7
@ tjt263 - คุณบอกว่าคุณเสียใจที่ใช้หน้าจอในตอนแรกดังนั้นคุณจะทำอย่างไรเพื่อให้กระบวนการทำงานต่อไปหากคุณไม่ได้ใช้หน้าจอ คุณยังสามารถทำสิ่งเดียวกันกับกระบวนการในหน้าจอ แต่หน้าจอมีข้อดีเพิ่มเติมคือคุณสามารถแยกออกจากมันและปล่อยให้กระบวนการทำงานโดยไม่ถูกรบกวน
Johnny

@DigitalChris มันอาจจะทำตอนนี้ ฉันรู้สึกว่าชื่อดั้งเดิมอาจมีความเกี่ยวข้องมากกว่า มี 3 screenจุดแตกต่างคือผมทำงานภายในโปรแกรม screenผมอยากจะหยุดใช้ screenฉันไม่ได้ต้องการที่จะหยุดโปรแกรมที่กำลังวิ่งอยู่ภายใน แค่นั้นแหละ. ฉันไม่รู้ว่าจะอธิบายสถานการณ์ให้ชัดเจนหรือง่ายกว่านี้ได้อย่างไร
เสียง

คำตอบ:


31

TLDR: คำตอบที่ใช้ได้จริง: ไม่

คำตอบอีกต่อไป:

ในทางทฤษฎีคุณสามารถ หากคุณเริ่มต้นสิ่งที่ชอบnohup myprog &จากภายในหน้าจอมันจะทำงานต่อไป มันจะไม่สนใจสัญญาณ hangup และจะไม่มีอินพุตใด ๆ แต่ใน theorie คุณสามารถทำงานกับมันได้

ในทางปฏิบัติกรณีนี้ไม่ได้ ดังนั้นหากคุณไม่ต้องการแนบดีบักเกอร์กับกระบวนการที่กำลังทำงานอยู่และเขียนการจัดการไฟล์อีกครั้งและตรวจสอบให้แน่ใจว่ากระบวนการจัดการสัญญาณ -1 เมื่อคุณปิดหน้าจอ ... จากนั้นคำตอบคือไม่

หากคุณพร้อมที่จะทำเช่นนี้ฉันมีบุ๊คมาร์คที่ชี้บ้าน [SU] อีกต่อไปที่มีคนไม่เพียงแค่นั้น บันทึกไว้เพื่อความสุดยอดไม่ใช่เพราะมันง่ายและน่าสนใจ


โปรดทราบว่าคำถามได้ถูกแก้ไขอย่างหนาแน่นตั้งแต่คำตอบของคุณ
chrylis -on strike-

การตัดการเชื่อมต่อกระบวนการนั้นค่อนข้างตรงไปตรงมา - มันเป็นคำถามของการตั้งค่ากลุ่มกระบวนการ (ด้วยdisownหรือในระดับที่ต่ำกว่า) ดังนั้นSIGHUPจะไม่มีการส่งเมื่อกระบวนการพาเรนต์ตาย การเชื่อมต่อ i / o อีกครั้งเป็นอีกสิ่งหนึ่ง - ที่ซึ่งตัวดีบักเข้ามา
alexis

คุณไม่จำเป็นต้องnohupถ้าคุณอยู่ในเปลือกควบคุมงาน (เช่นbash, ksh, csh, zsh, ashฯลฯ ) หากคุณยังคงใช้เชลล์ควบคุมที่ไม่ใช่งานเช่น Bourne shอาจถึงเวลาอัพเกรดแล้ว
ลูกไก่

23

คุณสามารถลองใช้reptyrเพื่อแนบแอปพลิเคชันที่รันอยู่อีกครั้งกับเทอร์มินัลอื่น มันมีปัญหาบางอย่างกับกระบวนการส่งไปยังพื้นหลัง

ฉันเพียงแค่ทดสอบมัน (เริ่มต้นhtopภายในscreen, reptyrมันยังอีกขั้วฆ่าscreen) และดูเหมือนว่ามันจะไม่เป็นไรทำงาน ยังคงเป็นวิธีแฮ็คจริง ๆ ดังนั้นจึงไม่มีการรับประกัน


1
น้อยกว่าการใช้ hacky gdb :)
Hennes

14

ใช่ (ถ้า "การฆ่า" ไม่ได้ฆ่าจริง ๆ ) นั่นคือหน้าจอที่แท้จริง คุณควรตรวจสอบคู่มือและลองใช้อันใดอันหนึ่งที่ตรงกับความต้องการของคุณ:

C-a d
C-a C-d     (detach)      Detach screen from this terminal.

C-a D D     (pow_detach)  Detach and logout.

สิ่งที่คุณต้องการคือตัวเลือกบรรทัดคำสั่งของหน้าจอ -D / -d -R / -r ขึ้นอยู่กับตัวเลือกของคุณ


1
สิ่งนี้ไม่ตอบคำถาม OP ไม่ต้องการแยกออกจากหน้าจอพวกเขาต้องการยุติกระบวนการหน้าจอ
Guntram Blohm สนับสนุน Monica

6
ใช่เขาเขียนว่า แต่ฉันไม่แน่ใจว่าเขาถามสิ่งที่เขาต้องการ
Gombai Sándor

11
@GuntramBlohm ไม่ชัดเจนเลยว่า OP เข้าใจดีว่าหน้าจอทำงานอย่างไรและนี่เป็นเอฟเฟกต์ที่ต้องการมากที่สุด
chrylis -on strike-

2
คุณทราบหรือไม่ว่าหน้าจอไม่ได้เป็นเทอร์มินัลที่แตกต่างจาก xterm แต่เป็นเลเยอร์ (เทอร์มินัลหลอก) ที่สามารถเชื่อมต่อกับเทอร์มินัลจริงของคุณ (vterm, xterm, terminator, (m) rxvt ใด ๆ ) และหน้าจอคือสิ่งที่ทำให้กระบวนการของคุณทำงานได้โดยที่คุณเริ่มต้นภายในหน้าจอ (และทำได้ดี) หากคุณฆ่าหน้าจอ (ฆ่าจริงๆ) จากนั้นคุณดึงพรมออกจากใต้กระบวนการของคุณ ... ฉันแค่ไม่เห็นเหตุผลที่ดีว่าทำไมคุณถึงทำเช่นนั้น
Gombai Sándor

1
@ GombaiSándor: เหตุผลหนึ่งที่ต้องการทำเช่นนั้นคือการทำให้กระบวนการพูดคุยโดยตรงกับเทอร์มินัลเพื่อส่งผ่านความสามารถที่หน้าจอไม่รู้ ตัวอย่างเช่นฉันเคยแฮ็ก xterm เวอร์ชั่นของฉันเองเพื่อสร้างปุ่มฟังก์ชั่นแปลก ๆ บนแป้นพิมพ์ของฉันส่งลำดับการหลีกเลี่ยงซึ่งรวมถึง X11 keysym และสถานะตัวแก้ไขแบบเต็มแทนที่จะพยายามหลอกว่ามันเป็น VT102 คำสำคัญสำหรับพวกเขาใน emacs ลำดับเหล่านั้นจะไม่ผ่านหน้าจอไม่เป็นอันตราย
Henning Makholm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.