Layar GNU membeku mencoba memasang kembali

16

Saya memiliki beberapa sesi layar GNU yang sudah berjalan lama. Saya ssh ke kotak yang mereka jalankan dan jalankan screen -d -r foountuk melepaskan mereka jika mereka terhubung di tempat lain, dan kemudian melampirkannya di jendela saya saat ini.

99% dari waktu ini berfungsi dengan baik, tetapi kadang-kadang saya mendapatkan ini:

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

... dan tidak ada yang terjadi; Saya tidak bisa kembali ke shell sama sekali. Mencoba di jendela lain melakukan hal yang sama, satu-satunya hal yang bisa saya lakukan adalah menghancurkan sesi layar itu (kehilangan semua program yang sedang berjalan di dalamnya) dan membuatnya kembali

Mengapa ini terjadi? Bagaimana saya bisa menghindarinya atau menyambung kembali dengan sukses ketika itu terjadi?


Edit : My .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

Sunting : Akhir stracelog ketika mencoba melampirkan:

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
Michael Mrozek
sumber
memposting ~ / .screenrc Anda (dan mungkin / etc / screenrc jika dikustomisasi) dapat membantu
user2387
Silakan kirim output dari strace screen -d -r foo(Anda mungkin perlu membuat salinan id yang tidak screendapat dieksekusi dari executable) dan strace -p$(pidof SCREEN)sekitar waktu koneksi ulang gagal.
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles Itu terjadi lagi; Saya menambahkan stracelog. straceing proses layar utama menunjukkan blok serupa dalam write()panggilan
Michael Mrozek
Tampaknya terjadi ketika layar yang terhubung sebelumnya tidak terputus dengan bersih (dalam hal ini saya telah terpasang dari komputer lain yang kemudian kehilangan koneksi jaringannya). Bisa screenjadi mencoba menulis ke koneksi yang sudah tidak ada?
Michael Mrozek
Apakah proses layar utama (yang disebut SCREEN) masih hidup? Apa yang sedang dilakukannya ( strace)?
Gilles 'SO- stop being evil'

Jawaban:

8

Tidak yakin apakah saya memiliki masalah yang sama dengan Anda, tetapi kadang-kadang saya memiliki perilaku layar yang sama setiap kali saya jaringan terputus.

Setelah beberapa saat (sekitar 10-15 menit) layar tersedia lagi untuk koneksi ulang. Setelah beberapa invetigations, saya telah menemukan catatan kecil di halaman manual:

   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.

Mungkin itu akan membantu seseorang, karena ini adalah satu-satunya halaman tentang pembekuan layar setelah google memutuskan hubungan saya.

buru-buru
sumber
Saya tidak benar-benar mengerti bagaimana berdasarkan pada entri halaman manual itu, tetapi ini memang memperbaikinya bagi saya. Saya atur nonblock 5beberapa waktu yang lalu, dan hanya mengalami masalah lagi, dan setelah 5 detik tiba-tiba terpasang dengan normal
Michael Mrozek
6

Sesi layar Anda mungkin digantung menunggu terminal pseudo dari shell yang terakhir Anda lampirkan dengan layar. Terkadang koneksi yang hilang meninggalkan shell di sekitar dan layar harus timeout untuk melepaskannya.

Jika Anda menjalankan ls -l /proc/<screen_pid>/fd/<descriptor_of_hung_write>, Anda akan melihat bahwa itu adalah poin untuk sesi shell sebelumnya.

Setelah Anda membunuh sesi bash / shell yang telah Anda lampirkan, Anda akan dapat melampirkan kembali.

# 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

Saya kasus ini, proses pembunuhan 23214 akan merilis sesi layar dan Anda dapat memasang kembali.

ZachL
sumber
3
Apa yang harus saya lakukan jika tidak memiliki proses induk?
d33tah
Yang ini membantu saya hari ini, membunuh sshd membuat layar responsif lagi! Jam dan jam kerja disimpan!
user230910
4

Sudahkah layar ditingkatkan sejak sesi layar itu dimulai?

Saya tidak dapat mengingat detail yang tepat tetapi saya ingat bahwa sekitar satu atau tiga bulan yang lalu, layar apt-get dist-upgrade(ke debian sid) ditingkatkan pada sistem saya dan postinst memperingatkan saya tentang upgrade yang tidak kompatibel. Salinan layar lama telah disimpan (di suatu tempat di bawah / tmp IIRC) untuk memungkinkan pemasangan kembali ke sesi lama, tetapi membunuh dan memulai kembali direkomendasikan.

Gejala yang Anda laporkan mirip dengan apa yang saya lihat ketika saya tidak sengaja mencoba menyambung kembali ke sesi layar lama dengan layar / usr / bin / baru.

Itu mungkin ini, dari dpkg.log kembali pada bulan Juni:

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

cas
sumber
Masalah ini telah diperbaiki sebelum Debian 7 Wheezy dirilis. Meskipun hadir dalam rilis hulu yang sesuai atau snapshot git. Lihat bugs.debian.org/683228
Axel Beckert
Ini baru saja terjadi pada saya hari ini pada instalasi Centos 6 yang lebih lama. Terima kasih!
Mike Andrews
Saya baru saja digigit oleh hal ini di Gentoo, saya meningkatkan dari 4.3 ke 4.4.
jlh