Saya memiliki beberapa sesi layar GNU yang sudah berjalan lama. Saya ssh ke kotak yang mereka jalankan dan jalankan screen -d -r foo
untuk 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 strace
log 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
sumber
strace screen -d -r foo
(Anda mungkin perlu membuat salinan id yang tidakscreen
dapat dieksekusi dari executable) danstrace -p$(pidof SCREEN)
sekitar waktu koneksi ulang gagal.strace
log.strace
ing proses layar utama menunjukkan blok serupa dalamwrite()
panggilanscreen
jadi mencoba menulis ke koneksi yang sudah tidak ada?SCREEN
) masih hidup? Apa yang sedang dilakukannya (strace
)?Jawaban:
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:
Mungkin itu akan membantu seseorang, karena ini adalah satu-satunya halaman tentang pembekuan layar setelah google memutuskan hubungan saya.
sumber
nonblock 5
beberapa waktu yang lalu, dan hanya mengalami masalah lagi, dan setelah 5 detik tiba-tiba terpasang dengan normalSesi 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.
Saya kasus ini, proses pembunuhan 23214 akan merilis sesi layar dan Anda dapat memasang kembali.
sumber
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
sumber