หน้าจอ GNU ค้างการพยายามใส่ใหม่


16

ฉันมีหน้าจอ GNU ที่ใช้เวลานานหลายครั้ง ฉัน ssh ไปที่กล่องที่พวกเขากำลังทำงานอยู่และเรียกใช้screen -d -r fooเพื่อแยกพวกเขาหากพวกเขาเชื่อมต่อที่อื่นแล้วแนบพวกเขาในหน้าต่างปัจจุบันของฉัน

99% ของเวลาทำงานได้ดี แต่ในบางครั้งฉันได้รับสิ่งนี้:

$ screen -d -r foo
[2430.foo detached.]

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

ทำไมสิ่งนี้ถึงเกิดขึ้น ฉันจะหลีกเลี่ยงหรือเชื่อมต่อสำเร็จเมื่อมันเกิดขึ้นได้อย่างไร


แก้ไข : ของฉัน.screenrc:

startup_message off
defwritelock off
bind q quit
caption always '%{gk}   (%n) %t                   %{y}%d %M %Y :: %c:%s                   %{b}%W%{d}'
screen -t ZSH
autodetach on
shelltitle ZSH
defutf8 on

แก้ไข : จุดสิ้นสุดของstraceบันทึกเมื่อพยายามแนบ:

readlink("/proc/self/fd/0", "/dev/pts/14", 4095) = 11
stat64("/dev/pts/14", {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 14), ...}) = 0
stat64("/dev/pts/14", {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 14), ...}) = 0
geteuid32()                             = 1000
getegid32()                             = 1000
open("/dev/pts/14", O_RDWR|O_NONBLOCK)  = 3
geteuid32()                             = 1000
getegid32()                             = 1000
close(3)                                = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
umask(0)                                = 022
lstat64("/var/run/screen", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
access("/var/run/screen/S-mrozekma", F_OK) = 0
stat64("/var/run/screen/S-mrozekma", {st_mode=S_IFDIR|0700, st_size=4096, ...}) = 0
umask(022)                              = 0
uname({sys="Linux", node="etudes-2", ...}) = 0
rt_sigaction(SIGHUP, {0x806e520, [], 0}, {SIG_DFL, [], 0}, 8) = 0
geteuid32()                             = 1000
getegid32()                             = 1000
open("/var/run/screen/S-mrozekma", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3
getdents(3, /* 6 entries */, 32768)     = 124
stat64("/var/run/screen/S-mrozekma/2386.chat", {st_mode=S_IFIFO|0700, st_size=0, ...}) = 0
geteuid32()                             = 1000
getegid32()                             = 1000
open("/var/run/screen/S-mrozekma/2386.chat", O_WRONLY|O_NONBLOCK) = 4
geteuid32()                             = 1000
getegid32()                             = 1000
fcntl64(4, F_SETFL, O_RDONLY)           = 0
geteuid32()                             = 1000
getegid32()                             = 1000
getdents(3, /* 0 entries */, 32768)     = 0
close(3)                                = 0
geteuid32()                             = 1000
getegid32()                             = 1000
setuid32(1000)                          = 0
setgid32(1000)                          = 0
stat64("/var/run/screen/S-mrozekma/2386.chat", {st_mode=S_IFIFO|0700, st_size=0, ...}) = 0
getpid()                                = 30081
write(4, "\0gsm\4\0\0\0/dev/pts/14\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 12336

การโพสต์ ~ / .screenrc ของคุณ (และอาจจะ / etc / screenrc หากมีการปรับแต่ง) อาจมีประโยชน์
user2387

โปรดโพสต์ผลลัพธ์ของstrace screen -d -r foo(คุณอาจต้องทำสำเนา id ที่ไม่ได้ตั้งค่า [ug] ของscreenไฟล์เรียกทำงาน) และstrace -p$(pidof SCREEN)ประมาณเวลาของการเชื่อมต่อที่ล้มเหลว
Gilles 'หยุดความชั่วร้าย' ใน

@Gilles มันเพิ่งเกิดขึ้นอีกครั้ง ฉันเพิ่มstraceบันทึก straceไอเอ็นจีกระบวนการหน้าจอหลักแสดงบล็อกที่คล้ายกันในการwrite()โทร
Michael Mrozek

ดูเหมือนว่าจะเกิดขึ้นเมื่อหน้าจอที่เชื่อมต่อก่อนหน้านี้ไม่ได้ถูกตัดการเชื่อมต่ออย่างหมดจด (ในกรณีนี้ฉันได้เชื่อมต่อกับคอมพิวเตอร์เครื่องอื่นซึ่งทำให้การเชื่อมต่อเครือข่ายขาดหาย) อาจscreenลองเขียนไปยังการเชื่อมต่อที่ไม่มีอยู่อีกต่อไป?
Michael Mrozek

กระบวนการหน้าจอหลัก (หนึ่งที่เรียกว่าSCREEN) ยังมีชีวิตอยู่หรือไม่? มันทำอะไร ( strace)?
Gilles 'หยุดความชั่วร้าย'

คำตอบ:


8

ไม่แน่ใจว่าฉันมีปัญหาแบบเดียวกันกับคุณหรือไม่ แต่บางครั้งฉันก็มีพฤติกรรมหน้าจอที่คล้ายกันทุกครั้งที่เครือข่ายของฉันถูกตัดการเชื่อมต่อโดยไม่ตั้งใจ

หลังจากผ่านไปสักครู่ (ประมาณ 10-15 นาที) หน้าจอจะสามารถเชื่อมต่อได้อีกครั้ง หลังจากการ invetigations ฉันพบบันทึกย่อขนาดเล็กในหน้าคน:

   nonblock [on|off|numsecs]

   Tell  screen  how to deal with user interfaces (displays) that cease to
   accept output. This can happen if a user presses ^S or a TCP/modem con‐
   nection gets cut but no hangup is received. If nonblock is off (this is
   the default) screen waits until the display restarts to accept the out‐
   put.  If  nonblock is on, screen waits until the timeout is reached (on
   is treated as 1s). If the display  still  doesn't  receive  characters,
   screen will consider it "blocked" and stop sending characters to it. If
   at some time it restarts to accept characters, screen will unblock  the
   display and redisplay the updated window contents.

อาจเป็นเพราะมันจะช่วยใครซักคนเพราะนี่เป็นหน้าเดียวเกี่ยวกับการค้างหน้าจอหลังจากที่ Google ไม่ได้ให้ข้อมูลกับฉัน


ฉันไม่เข้าใจว่าขึ้นอยู่กับรายการหน้าคนนั้น แต่นี่แก้ไขได้สำหรับฉัน ฉันตั้งnonblock 5ระยะเวลาหนึ่งแล้วและเพิ่งพบปัญหาอีกครั้งและหลังจาก 5 วินาทีมันก็ติดตามปกติ
Michael Mrozek

6

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

หากคุณเรียกใช้ls -l /proc/<screen_pid>/fd/<descriptor_of_hung_write>คุณจะเห็นว่ามันเป็น pts ของสำหรับเชลล์เซสชั่นก่อนหน้า

เมื่อคุณฆ่าเซสชัน bash / shell ที่คุณแนบไว้คุณจะสามารถแนบไฟล์ได้อีกครั้ง

# ps auwxf|grep -B2 screen
root     23214  0.0  0.0 109304  4016 ?        Ssl  19:13   0:00  \_ sshd: root@pts/6 
root     23566  0.0  0.0 117400  2272 pts/6    Ss   19:13   0:00      \_ -bash
root     10445  0.0  0.0 125156  1156 pts/6    S+   19:23   0:00          \_ screen -ADR MYSCREEN

ในกรณีนี้กระบวนการฆ่า 23214 จะเปิดเซสชันของหน้าจอและคุณสามารถติดตั้งใหม่ได้


3
ฉันควรทำอย่างไรหากไม่มีกระบวนการหลัก
d33tah

สิ่งนี้ช่วยฉันในวันนี้การฆ่า sshd ทำให้หน้าจอตอบสนองอีกครั้ง! ชั่วโมงและเวลาทำงานบันทึก!
user230910

4

หน้าจอได้รับการอัพเกรดตั้งแต่หน้าจอเริ่มขึ้นหรือไม่

ฉันไม่สามารถจำที่แน่นอนรายละเอียด แต่ฉันจะจำไว้ว่าประมาณเดือนหรือสามที่ผ่านมาเป็นapt-get dist-upgradeหน้าจออัพเกรด (เป็นเดเบียน sid) ในระบบของฉันและโพสต์ข้อความเตือนฉันเกี่ยวกับการอัปเกรดที่เข้ากันไม่ได้ สำเนาของหน้าจอเก่าถูกเก็บไว้ (ที่ภายใต้ / tmp IIRC) เพื่อเปิดใช้งานการ reattaching ไปยังเซสชันเก่า แต่แนะนำให้ฆ่าและรีสตาร์ทพวกเขา

อาการที่คุณรายงานนั้นคล้ายกับสิ่งที่ฉันเห็นเมื่อฉันพยายามเชื่อมต่อเซสชันหน้าจอเก่าโดยไม่ตั้งใจด้วย / usr / bin / หน้าจอใหม่

อาจเป็นไปได้ว่าจาก dpkg.log ย้อนกลับไปในเดือนมิถุนายน:

2012-06-14 08:11:51 upgrade screen:amd64 4.0.3-14 4.1.0~20120320gitdb59704-2


ปัญหานี้ได้รับการแก้ไขก่อนที่จะปล่อย Debian 7 Wheezy แม้ว่ามันจะมีอยู่ในการเผยแพร่ต้นน้ำตามหรือภาพรวม Git ดูbugs.debian.org/683228
Axel Beckert

สิ่งนี้เพิ่งเกิดขึ้นกับฉันในวันนี้กับ Centos 6 รุ่นเก่าที่ติดตั้ง ขอบคุณ!
Mike Andrews

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