ถ่ายโอนคำสั่งปัจจุบันไปยังเซสชันที่ถอดออกได้ (tmux / หน้าจอ)


35

ฉันกำลังทำงานการสำรองข้อมูลและตอนนี้จะต้องมีการโอนไปที่ถอดออกได้อย่างใดอย่างหนึ่งเช่นเดียวกับหรือtmux screenมีวิธีการทำเช่นนี้เมื่อคำสั่งกำลังทำงานอยู่?

ฉันสามารถส่งคำสั่งพื้นหลังโดยกดCtrl+ Zและวางมันกลับขึ้นมาโดยการออกfgคำสั่ง แต่ฉันไม่ทราบว่าเซสชันนั้นสามารถย้อนกลับไปได้หรือไม่เมื่อฉันออกจากเทอร์มินัล


1
ไม่มีวิธีการทำเช่นนั้น คุณต้องเริ่มคำสั่งจากภายในหน้าจอ (หรือเซสชันอื่น) เพื่อให้สามารถถอดออกได้
Dan D.

คำตอบ:


40

วิธีนี้ใช้ได้ผลเกือบทุกครั้ง:

สิ่งที่จำเป็นต้องมี: มีreptyrและtmux/ screenติดตั้ง; คุณจะสามารถค้นหาพวกเขาด้วยapt-getหรือyumขึ้นอยู่กับแพลตฟอร์มของคุณ

  1. ใช้Ctrl+ Zเพื่อระงับกระบวนการ

  2. ดำเนินการกระบวนการต่อในพื้นหลังด้วย bg

  3. ค้นหา ID กระบวนการของกระบวนการพื้นหลังด้วย jobs -l

    คุณจะเห็นสิ่งที่คล้ายกับสิ่งนี้:

    [1]+ 11475 Stopped (signal) yourprocessname
    
  4. บอกเลิกงานจากพาเรนต์ปัจจุบัน (เชลล์) ด้วย disown yourprocessname

  5. เริ่มต้นtmux(แนะนำ) screenหรือ

  6. ติดตั้งซ้ำกระบวนการtmux/ screenเซสชันด้วย reptyr:

    reptyr 11475
    
  7. ตอนนี้คุณสามารถถอด Multiplexer (ค่าเริ่มต้นCtrl+ B, DสำหรับtmuxหรือCtrl+ A, Dสำหรับscreen) และยกเลิกการเชื่อมต่อ SSH ในขณะที่กระบวนการของคุณยังคงอยู่ใน/tmuxscreen

  8. ต่อมาเมื่อคุณเชื่อมต่อกับ SSH อีกครั้งคุณสามารถแนบมัลติเพล็กเซอร์ (เช่นtmux attach)


2
น่าเสียดายหลังจากทำงานsudo reptyr 1430ฉันยังคงได้รับ: "... [-] ไม่สามารถเปิด tty ในเด็กไม่สามารถแนบ pid 1430: การอนุญาตถูกปฏิเสธ"
Daryl Spitzer

2
คุณอาจประสบความสำเร็จกับตัวเลือก -L เช่น reptyr -L 1430 ในกรณีของคุณ
cgseller

1
เรียกใช้เมื่อจำเป็น:echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
Yanhao

มันยังอยู่บน Arch ผ่าน yo: archlinux.org/packages/community/i686/reptyr (ไม่ใช่ apt-get หรือ yum)
Tommy

1
หลังจากbgขั้นตอนที่ควรจะทำงานในพื้นหลังเพื่อให้jobsควรจะพูดมากกว่าRunning Stopped
G-Man

1

reptyr เป็นสิ่งที่ดี แต่ฉันได้รับข้อผิดพลาดในการอนุญาต

$ reptyr 30622

[-] Unable to open the tty in the child.
Unable to attach to pid 30622: Permission denied

จากนั้นก็พบว่า
-L Like '-l', but also redirect the child's stdio to the slave.

ซึ่งทำงานเหมือนจับใจ

$ reptyr -L 30622
Opened a new pty: /dev/pts/4

เมื่อฉันเพิ่ม-Lฉันได้รับข้อความเหมือนที่คุณพูดOpened a new pty: /dev/pts/6แต่การระงับของฉันtopไม่ปรากฏใน tmux ฉันคิดถึงอะไรที่นี่
Mehrad Mahmoudian

-1

คุณสามารถใช้การปฏิเสธเพื่อแยกงานออกจากเทอร์มินัลหากคำสั่งนั้นพร้อมใช้งาน

มันปลอดภัยที่จะรันด้วย nohup เพื่อเริ่มต้นด้วย


คุณขยายได้ไหม คุณหมายถึงอะไรที่จะเริ่มต้นด้วยnohup? อย่างไรdisowningกระบวนการทำงานอย่างไร
Darth Android

disown แยกกระบวนการพื้นหลัง (ที่คุณใส่ไว้ในพื้นหลังด้วย control-z) จากเทอร์มินัลดังนั้นกระบวนการจะดำเนินการต่อหลังจากเทอร์มินัลหายไป คุณสามารถพิมพ์ disown หลังจาก control-z หากพบคำสั่ง อย่างไรก็ตามเรื่องนี้อยู่ในทฤษฎีและอาจไม่ทำงานได้อย่างน่าเชื่อถือ ครั้งต่อไปจะปลอดภัยยิ่งขึ้นโดยเพิ่ม nohup ที่ด้านหน้าโปรแกรมของคุณเพื่อให้คุณสามารถออกจากเครื่องได้อย่างปลอดภัย
johnshen64

ฉันพบว่า 'ปฏิเสธ' เป็นสิ่งที่ไม่น่าเชื่อถือตามที่กล่าวไว้ nohup ไม่ได้ดีขึ้นอย่างมหาศาลจริงๆ reptyr อาจเป็นทางออกอย่างไรก็ตาม github.com/nelhage/reptyr
anastrophe

นี่ไม่ได้ตอบคำถาม คำถามไม่เพียง "ฉันจะปิดเครื่องโดยไม่ฆ่าข้อมูลสำรองได้อย่างไร" แต่จะเป็น "ฉันจะดำเนินการต่อในภายหลังได้อย่างไร" คำตอบที่ถูกต้องคือ "คุณไม่สามารถ"
Gabe

ฉันเห็นความขัดแย้งทางความหมายที่เป็นไปได้ที่นี่และนี่เป็นผลการค้นหายอดนิยมสำหรับคำหลักเช่น 'relocatable', 'ตำแหน่งที่เป็นอิสระ', 'detach tmux' ฯลฯ ดังนั้นฉันหวังว่าคุณจะสามารถให้อภัย necro-post คุณหมายถึง "คุณไม่สามารถ" เนื่องจากการแมปหน่วยความจำที่แตกต่างกันระหว่างการหยุดโปรแกรมและดำเนินการต่อหรือไม่ โปรแกรมสำรองข้อมูลจะรู้ว่าไฟล์ใดที่จะสำรองตามโครงสร้างไฟล์ที่กำหนดไว้และโครงสร้างไฟล์นั้นมีอยู่เพื่อให้หน่วยความจำกายภาพนั้นสามารถทำแผนที่ได้ในอนาคต (เราสำรองข้อมูลไว้สำหรับโอกาสที่ไม่เป็นเช่นนั้น!)
John P
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.