ติดตั้งซ้ำไปยังเซสชันหน้าจอที่มีอยู่


81

ฉันมีโปรแกรมที่ทำงานภายใต้หน้าจอ อันที่จริงแล้วเมื่อฉันแยกตัวออกจากเซสชันและตรวจสอบ netstat ฉันจะเห็นว่าโปรแกรมยังคงทำงานอยู่ (ซึ่งเป็นสิ่งที่ฉันต้องการ):

udp        0      0 127.0.0.1:1720          0.0.0.0:*                           3759/ruby       

ตอนนี้ฉันต้องการแนบเซสชันที่ใช้กระบวนการนั้นอีกครั้ง ดังนั้นฉันจะเริ่มต้นสถานีใหม่และพิมพ์หน้าจอ -r

$ screen -r
There are several suitable screens on:
    5169.pts-2.teamviggy    (05/31/2013 09:30:28 PM)    (Detached)
    4872.pts-2.teamviggy    (05/31/2013 09:25:30 PM)    (Detached)
    4572.pts-2.teamviggy    (05/31/2013 09:07:17 PM)    (Detached)
    4073.pts-2.teamviggy    (05/31/2013 08:50:54 PM)    (Detached)
    3600.pts-2.teamviggy    (05/31/2013 08:40:14 PM)    (Detached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.

แต่ฉันจะรู้ได้อย่างไรว่าเซสชันใดที่ฉันใช้สร้างกระบวนการนั้น

ตอนนี้หนึ่งในเอกสารที่ฉันเจอก็พูดว่า:

"เมื่อคุณใช้หน้าต่างพิมพ์ Ca A เพื่อตั้งชื่อชื่อนี้จะถูกใช้ในรายการหน้าต่างและจะช่วยให้คุณจดจำสิ่งที่คุณทำในแต่ละหน้าต่างเมื่อคุณเริ่มใช้งานหน้าต่างจำนวนมาก "

สิ่งที่เกิดขึ้นคือเมื่อฉันอยู่ในเซสชันหน้าจอใหม่ฉันพยายามกด control + a A และไม่มีอะไรเกิดขึ้น


วิธีที่รวดเร็วในการเลือกหนึ่งรายการจากรายการของหน้าจอที่เปิดหลายหน้าscreen -rตามด้วยหมายเลข 1, 2, 3 ...ในรายการหน้าจอนั้น
user18099

คำตอบ:


91

มี "รายการ" สองระดับที่เกี่ยวข้องที่นี่ ครั้งแรกที่คุณมีหน้าต่าง "รายชื่อ" ในเซสชั่นของแต่ละบุคคลซึ่งเป็นสิ่งที่ Ctrl-A A สำหรับ, และครั้งที่สองมี "เซสชั่นรายการ" screen -lsซึ่งเป็นสิ่งที่คุณได้วางในคำถามของคุณและสิ่งที่ยังสามารถดูได้ด้วย

คุณสามารถปรับแต่งชื่อเซสชันด้วย-Sพารามิเตอร์มิฉะนั้นจะใช้ชื่อโฮสต์ของคุณ (teamviggy) ตัวอย่างเช่น:

$ screen

(ctrl-A d เพื่อแยกออก)

$ screen -S myprogramrunningunderscreen

(ctrl-A d เพื่อแยกออก)

$ screen -ls

There are screens on:
    4964.myprogramrunningunderscreen    (05/31/2013 09:42:29 PM)    (Detached)
    4874.pts-1.creeper  (05/31/2013 09:39:12 PM)    (Detached)
2 Sockets in /var/run/screen/S-paul.

เป็นโบนัสคุณสามารถใช้ชื่อย่อที่ชัดเจนของชื่อที่คุณส่งไปยัง-Sภายหลังเพื่อเชื่อมต่อใหม่:

screen -r myprog

(ฉันเชื่อมต่อกับmyprogramrunningunderscreenเซสชันอีกครั้ง)


ctrl + aa นั้นเหมาะกับคุณไหม ฉันกด control + a พร้อมกันแล้วกดอีกครั้งอย่างรวดเร็วและไม่มีอะไรเกิดขึ้น
JohnMerlino

ใช่; มีความแตกต่างระหว่างและctrl-A a หลังได้รับแจ้งให้ฉันไปctrl-A shift-A Set window's title to:ตรวจสอบให้แน่ใจว่าคุณกดปุ่ม Shift สำหรับ A ที่สอง
Paul

ฉันทำ: "screen -r 21tweet" และได้รับเป็น reponse: "มีหน้าจอเมื่อ: 3239.21tweet (08/21/2015 09:14:35 AM) (แนบ) ไม่มีหน้าจอที่จะกลับมาจับคู่ 21tweet ต่อไป" สิ่งนี้จะเป็นอย่างไร
ไมเคิล

ข้อแม้ที่ไม่ชัดเจนมากที่มีหน้าจอการตั้งชื่อคือถ้าคุณตั้งชื่อพวกเขาด้วย-Sคุณจะต้องใช้ตัวย่อที่ชัดเจนอย่างน้อยที่สุดของชื่อต่อจากหมายเลข ID และจุดในชื่อเต็มของเซสชันของหน้าจอเมื่อกลับมาทำงาน ชื่อเซสชันที่สร้างซึ่งคุณสามารถรวม ID และจุด
Spencer Williams

1
แก้ไขผิด และเว็บไซต์นี้จะไม่ให้ฉันโพสต์ความคิดเห็นที่สั้นโดยไม่มีข้อความเพิ่มเติม
Paul

37

ฉันมีกรณีที่screen -rไม่สามารถติดตั้งใหม่ได้ การเพิ่ม-dค่าสถานะดังนั้นจึงเป็นเช่นนี้

screen -d -r

ทำงานให้ฉัน มันถอดหน้าจอก่อนหน้าและอนุญาตให้ฉันติดตั้งใหม่ ดูหน้า Man สำหรับข้อมูลเพิ่มเติม


12

วิธีที่ง่ายคือเพียงเชื่อมต่อใหม่ไปยังหน้าจอที่กำหนดเองด้วย

screen -r

จากนั้นเมื่อคุณรันหน้าจอคุณสามารถรับรายการของหน้าจอที่ใช้งานอยู่ทั้งหมดโดยกดปุ่มCtrl-A "(เช่น control-A แล้วตามด้วยเครื่องหมายคำพูดคู่) จากนั้นคุณสามารถเลือกหน้าจอที่ใช้งานอยู่ทีละหนึ่งและดูสิ่งที่พวกเขากำลังทำงานอยู่ แน่นอนว่าการตั้งชื่อหน้าจอจะทำให้การระบุหน้าจอที่ถูกต้องง่ายขึ้น

แค่สองเซ็นต์ของฉัน


ตกลงฉันจะตั้งชื่อหน้าจอของฉันได้อย่างไร
austin

@austin screen -S <sessionname>
Brian

4

ฉันมักจะใช้คอมโบต่อไปนี้ซึ่งฉันต้องทำงานกับหลาย ๆ เครื่องในหลาย ๆ คลัสเตอร์:

screen -S clusterX

สิ่งนี้จะสร้างเซสชันหน้าจอใหม่ที่ฉันสามารถสร้างสภาพแวดล้อม

screen -dRR clusterX

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

ความรุ่งโรจน์มากมายที่จะhttps://support.dvsus.com/hc/en-us/articles/212925186-Linux-GNU-Screen-instructionsสำหรับเคล็ดลับนี้กลับมาอีกครั้ง

แก้ไข:

นอกจากนี้ยังมีคำอธิบายที่เป็นประโยชน์เล็กน้อยจากman screenพารามิเตอร์ที่เป็นความลับ

       -d -r   Reattach a session and if necessary detach it first.

       -d -R   Reattach a session and if necessary detach or  even  create  it
               first.

       -d -RR  Reattach  a  session  and if necessary detach or create it. Use
               the first session if more than one session is available.

       -D -r   Reattach a session. If necessary  detach  and  logout  remotely
               first.

มีมากขึ้นด้วย-Dดังนั้นโปรดตรวจสอบman screen


2

ผลลัพธ์ของการจัดรูปแบบเช่นscreen -list pid.tty.hostpids สามารถใช้เพื่อให้ได้กระบวนการลูกแรกกับpstree:

screen -list|cut -f1 -d'.'|cut -f2|xargs -n 1 pstree -p|grep "^screen"

คุณจะได้รับรายการเช่นนี้

screen(5169)---zsh(5170)---less(15268)
screen(4872)---zsh(4873)-+-cat(11364)
...

1
screen -d -r 4964

หรือ

screen -d -r 4874

$ screen -ls
There are screens on:
4964.myprogramrunningunderscreen    (05/31/2013 09:42:29 PM)    (Detached)
4874.pts-1.creeper  (05/31/2013 09:39:12 PM)    (Detached)
2 Sockets in /var/run/screen/S-paul.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.