GNU ekranı yeniden takmaya çalışırken donuyor


16

Birkaç uzun süredir çalışan GNU ekran oturumum var. Koştukları ve koştukları kutuya sshscreen -d -r foo başka bir yere bağlılarsa onları ayırmak için ve sonra mevcut pencereme ekliyorum.

Zamanın% 99'u iyi çalışıyor, ancak bazen bunu alıyorum:

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

... ve hiçbir şey olmuyor; Kabuğa hiç geri dönemem. Başka bir pencerede denemek aynı şeyi yapar, yapabileceğim tek şey o ekran oturumunu yok etmek (içinde çalışan tüm programları kaybetmek) ve yeniden oluşturmak

Bu neden oluyor? Ne zaman önleyebilir veya ne zaman başarılı bir şekilde yeniden bağlanabilirim?


Düzenleme : Benim .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

Düzenleme : straceEklemeye çalışırken günlüğün sonu :

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 (ve belki de / etc / screenrc varsa)
yayınlamak

Lütfen çıkışını strace screen -d -r foo( screenyürütülebilir dosyanın ayarlanmamış bir [ug] kimlik kopyasını oluşturmanız gerekebilir ) ve strace -p$(pidof SCREEN)başarısız bir yeniden bağlanma süresi boyunca yayınlayın.
Gilles 'SO- kötü olmayı bırak'

@Gilles Sadece tekrar oldu; straceGünlüğü ekledim . straceana ekran işlemi bir write()çağrıda benzer bir blok gösterir
Michael Mrozek

Daha önce bağlanan ekranın temiz bir şekilde bağlantısı kesilmediğinde ortaya çıkıyor (bu durumda, daha sonra ağ bağlantısını kaybeden başka bir bilgisayardan bağladım). screenArtık var olmayan bir bağlantıya yazmaya çalışıyor olabilir misiniz ?
Michael Mrozek

Ana ekran işlemi (denilen SCREEN) hala hayatta mı? Ne yapıyor ( strace)?
Gilles 'SO- kötü olmayı bırak'

Yanıtlar:


8

Sizinle aynı sorunu yaşayıp yaşamadığımdan emin değilim, ancak bazen her ağımın bağlantısı kesildiğinde aynı ekran davranışını yaşıyorum.

Bir süre sonra (yaklaşık 10-15 dakika) tekrar bağlantı için tekrar kullanılabilir. Bazı istilalardan sonra, man sayfasında küçük bir not buldum:

   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.

Belki birine yardım edecek olabilir, çünkü bu google bana verdi sonra ekran donmaları hakkında tek sayfa budur.


Tam olarak bu man sayfa girişine dayanarak anlamıyorum, ama bu benim için düzeltti. nonblock 5Bir süre önce belirledim ve tekrar tekrar karşılaştım ve 5 saniye sonra aniden normal bir şekilde bağlandı
Michael Mrozek

6

Ekran oturumunuz muhtemelen ekrana en son bağladığınız kabuğun sözde terminalini beklemektedir. Bazen kayıp bir bağlantı o kabuğun etrafında kalır ve ekranın kopması için zaman aşımına uğraması gerekir.

Çalıştırırsanız ls -l /proc/<screen_pid>/fd/<descriptor_of_hung_write>, önceki kabuk oturumu için puanları olduğunu görmelisiniz.

Eklediğiniz bash / shell oturumunu öldürdüğünüzde yeniden takabilirsiniz.

# 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

Bu durumda, öldürme işlemi 23214, ekran oturumunu serbest bırakacak ve yeniden bağlayabilirsiniz.


3
Ebeveyn işlemi yoksa ne yapmalıyım?
d33tah

Bu bugün bana yardımcı oldu, sshd öldürmek ekran tekrar duyarlı hale! Saatler ve çalışma saatleri kurtarıldı!
user230910

4

Bu ekran oturumları başlatıldığından beri ekran yükseltildi mi?

Ben hatırlamıyorum tam ayrıntıları ama önce bir ay ya da üç hakkında unutulmaması bunuapt-get dist-upgrade sistemimdeki (debian sid'e) yükseltilmiş bir ekranın ve postinst'in uyumsuz bir yükseltme hakkında beni uyardığını . Eski oturumların yeniden bağlanmasını sağlamak için eski ekranın bir kopyası (/ tmp IIRC altında bir yerde) saklanmıştı, ancak bunların öldürülmesi ve yeniden başlatılması önerildi.

Bildirdiğiniz belirtiler, yanlışlıkla yeni / usr / bin / screen ile eski bir ekran oturumuna yeniden bağlanmaya çalıştığımda gördüklerime benziyor.

Muhtemelen Haziran ayında dpkg.log'dan:

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


Debian 7 Wheezy piyasaya sürülmeden önce bu sorun düzeltildi. Buna rağmen yukarı akış sürümlerinde veya git anlık görüntülerinde mevcuttur. Bugs.debian.org/683228
Axel Beckert

Bu bana bugün eski bir Centos 6 kurulumunda oldu. Teşekkürler!
Mike Andrews

Sadece Gentoo tarafından ısırıldı, 4.3'ten 4.4'e yükseltiyordum.
jlh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.