หน้าจอ GNU - ไม่สามารถแนบหน้าจออีกครั้งหลังจากขาดการเชื่อมต่อ


23

ฉันใช้ irssi บนหน้าจอ แต่ขาดการเชื่อมต่อ หลังจากฉันกลับไปที่เซิร์ฟเวอร์ฉันไม่สามารถเชื่อมต่อกับหน้าจอนั้นได้อีก หน้าจอ -ls แสดงว่าหน้าจอได้ถูกแนบไปแล้ว

ฉันลองใช้หน้าจอ -Dเพื่อบังคับให้ถอดออกและมันบอกว่าแยกออก แต่หน้าจอ -ls ยังบอกว่ามันติดอยู่ ฉันลองใช้หน้าจอ -xและมันก็แค่หยุดตรงนั้น

[sub@server ~]$ screen -ls 
There are screens on:
 4033.poe (Detached)
 7728.irssi (Attached)
2 Sockets in /var/run/screen/S-sub.

ฉันจะทำอะไรได้บ้าง

คำตอบ:


14

ถ้าคุณกำลังพยายามที่จะเชื่อมต่อกับหน้าจอ 'แนบ' screen -xr irssiทำงานแล้ว ตัวพิมพ์ใหญ่ '-X' ส่งคำสั่งไปยังหนึ่งในเซสชันหน้าจอตัวเลือก '-x' ตัวพิมพ์เล็กให้คุณเชื่อมต่อกับเซสชันที่แนบ แต่คุณยังต้องให้ชื่อเซสชันเนื่องจากมีมากกว่าหนึ่ง


9

ฉันล้างพฤติกรรมนี้ในอดีตโดยการฆ่าเชลล์ที่เริ่มเซสชันของหน้าจอ โดยพื้นฐานแล้วการฆ่าอินสแตนซ์ bash ทั้งหมดสำหรับผู้ใช้ของฉันที่ไม่ได้เป็นเจ้าของโดยหน้าจอ


2
ลองใช้ตัวเลือกทั้งหมด (-RD, -xr) ที่กล่าวถึงที่นี่และไม่สามารถกู้คืนเซสชันได้ จบลงด้วยการฆ่าเซสชั่นหน้าจอโดยการหา (ps -ef | grep bash) มัน
so_mv

4

คุณให้ชื่อที่ไม่ใช่ค่าเริ่มต้น ลองสิ่งนี้:screen -RD irssi


2
ฉันมีปัญหาที่คล้ายกัน แต่หน้าจอ -RD <name> ยังคงค้าง ... :-(
harald

4

คุณสามารถลอง:

#Reattach a session and if necessary detach it first.
screen -d -r 7728.irssi  

#Reattach a session. If necessary detach and logout remotely first.
screen -D -r 7728.irssi

ควรใช้ชื่อเต็มเสมอ pid.tty


3

screenเป็นที่รู้จักกันว่าไม่ได้เข้ากันได้ระหว่างเวอร์ชันต่าง ๆ หากเวอร์ชันของscreenอัปเดตบนเซิร์ฟเวอร์อาจเป็นไปได้ว่าคุณไม่สามารถติดตั้งเซสชันหน้าจอที่เก่ากว่าอีกต่อไป

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


2

ฉันประสบความสำเร็จด้วยการส่ง GNU / กระบวนการ SIGCHLD (ซึ่งปกติจะได้รับเมื่อปิดหน้าต่าง) สิ่งนี้บังคับให้มันแตะ (และอาจสร้างขึ้นใหม่) ไฟล์ซ็อกเก็ต

โปรดทราบว่ามีสองวิธีในการเรียกใช้งานscreenโปรแกรมที่แตกต่างกันในกรณีที่: SCREENเป็นส่วนประกอบฝั่งเซิร์ฟเวอร์ที่คุณพยายามเชื่อมต่ออีกครั้งในขณะscreenที่ฝั่งไคลเอ็นต์ที่สับเปลี่ยนข้อมูลระหว่างเทอร์มินัลของคุณและฝั่งเซิร์ฟเวอร์ ดังนั้นคุณอาจต้องการลองฆ่าเวอร์ชั่นตัวพิมพ์เล็ก ...

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

# ps fao pid,command
25070 SCREEN -U
25071  \_ vim +let &t_Co=256
25073  \_ -bash
25077  \_ -bash
...
18364  \_ sshd: username [priv]
18366  |   \_ sshd: username@pts/17
18367  |       \_ -bash
  870  |           \_ screen -U -x

เซสชันที่สดใหม่มีลักษณะเช่นนี้:

19645  |  \_ screen -S MySession
19646  |      \_ SCREEN -S MySession
19647  |          \_ bash
 1485  |          |   \_ python
19700  |          \_ bash

จะส่ง SIGCHILD ได้อย่างไร?
giorgio79

1
ใช้killคำสั่งที่ตั้งชื่ออย่างไม่สุภาพดังนี้: kill -s SIGCHLD <PID>อยู่ที่ไหน<PID>หมายเลขรหัสกระบวนการ (คอลัมน์ซ้ายสุดในผลลัพธ์ตัวอย่างของฉัน)
RobM

1

สิ่งนี้เกิดขึ้นกับฉันในขณะที่ฉันใช้ vi เมื่อเซสชันหยุดชะงักและฉันขาดการเชื่อมต่อ เมื่อพยายามแนบหน้าจออีกครั้งโดยใช้หน้าจอ -Arx กระบวนการจะหยุดทำงาน

อาจมีกระบวนการลูกที่คล้ายกันซึ่งทำให้หน้าจอหยุดทำงาน หากคุณจำสิ่งใดสิ่งหนึ่งโดยเฉพาะอย่างยิ่งในสิ่งนั้นมิฉะนั้นเพื่อรับรายการกระบวนการลูกที่ทำงานภายใต้หน้าจอของคุณให้ทำ:

ps ux -H

ซึ่งจะแสดงกระบวนการลูกที่ซ้อนกัน:

zwood    28481  0.0  0.0 101148  8844 ?        Ss   Oct07   1:36 SCREEN -S mysession
zwood    28482  0.0  0.0  67436  1744 pts/2    Ss+  Oct07   0:00   /bin/bash
zwood    28515  0.0  0.0  67556  1876 pts/4    Ss+  Oct07   0:00   /bin/bash
zwood     4498  0.0  0.0  67436  1772 pts/5    Ss   Oct07   0:00   /bin/bash
zwood     2007  0.0  0.0  73604  1324 pts/5    S+   15:47   0:00     vi /home/zwood/.bashrc.custom
zwood    14670  0.0  0.0  67436  1768 pts/13   Ss+  Oct14   0:00   /bin/bash
zwood    27002  0.0  0.0  67436  1720 pts/11   Ss+  Oct20   0:00   /bin/bash
zwood    24748  0.0  0.0  67432  1712 pts/14   Ss+  Oct21   0:00   /bin/bash

หลังจากฆ่ากระบวนการ vi ที่ทำให้เกิดปัญหาในตอนแรกฉันสามารถติดตั้งหน้าจอใหม่ได้โดยไม่มีปัญหาใด ๆ การฆ่ากระบวนการก่อนหน้านี้ที่เคยติดตั้งไปที่หน้าจออาจเป็นความคิดที่ดีเช่นกัน เพียงใช้:

kill -9 <pid>

ฉันไม่ทราบว่าหน้าจอกำลังทำอะไรภายในเหตุใด vi จึงทำให้หน้าจอหยุดทำงานและทำไมการฆ่ากระบวนการ vi ทำให้หน้าจอของฉันกลับมา ฉันพบปัญหากับหน้าจอในอดีตและลองสิ่งที่คนส่วนใหญ่แนะนำในหัวข้อนี้โดยไม่มีโชค การค้นหากระบวนการเด็กปัญหานี้เป็นสิ่งเดียวที่ทำงานให้ฉันและทำงานอย่างต่อเนื่อง


ความสนุกสนานในการฆ่ากระบวนการภายใต้หน้าจอเป็นสิ่งเดียวที่ช่วยฉันเช่นกัน ฉันอยากเสียกระบวนการมากมายภายใต้หน้าจอแทนที่จะเสียเซสชั่นหน้าจอทั้งหมด!
Yonatan


0
killall -9 sshd

มันใช้งานได้สำหรับฉัน ฉันมี 3 หน้าจอที่แตกต่างกันและฉันเสียการเชื่อมต่อ SSH 3 ครั้ง หลังจากเชื่อมต่ออีกครั้งหน้าจอยังคงเชื่อมต่ออยู่ฉันออกคำสั่งด้านบน ... แน่นอนว่าฉันขาดการเชื่อมต่อปัจจุบัน แต่เป็นหน้าจอใหม่ ในการเชื่อมต่อครั้งต่อไปทุกหน้าจอถูกถอดออก

หมายเหตุถ้าคุณเป็น superuser คุณควรใช้--userตัวเลือกเพื่อฆ่า ssh daemons ของคุณเท่านั้น

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