Màn hình GNU đóng băng cố gắng gắn lại


16

Tôi có một số phiên màn hình GNU chạy dài. Tôi ssh vào hộp họ đang chạy và chạy screen -d -r foođể tách chúng ra nếu chúng được kết nối ở bất kỳ nơi nào khác, và sau đó gắn chúng vào cửa sổ hiện tại của tôi.

99% thời gian này hoạt động tốt, nhưng nhân dịp tôi nhận được điều này:

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

... và không có gì xảy ra; Tôi không thể lấy lại vỏ. Thử trong một cửa sổ khác cũng làm điều tương tự, điều duy nhất tôi có thể làm là phá hủy phiên màn hình đó (mất tất cả các chương trình đang chạy trong đó) và tạo lại nó

Lý do tại sao điều này xảy ra? Làm thế nào tôi có thể tránh nó hoặc kết nối lại thành công khi nó xảy ra?


Chỉnh sửa : Của tôi .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

Chỉnh sửa : Kết thúc stracenhật ký khi cố gắng đính kèm:

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

đăng ~ / .screenrc của bạn (và có thể / etc / screenrc nếu được tùy chỉnh) có thể hữu ích
user2387

Vui lòng gửi đầu ra của strace screen -d -r foo(bạn có thể cần tạo một bản sao id [ug] không được thiết lập của screentệp thực thi) và strace -p$(pidof SCREEN)khoảng thời gian kết nối lại không thành công.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles Nó vừa xảy ra lần nữa; Tôi đã thêm stracenhật ký. stracetrong quá trình màn hình chính hiển thị một khối tương tự trong một write()cuộc gọi
Michael Mrozek

Điều này dường như xảy ra khi màn hình được kết nối trước đó không được ngắt kết nối sạch sẽ (trong trường hợp này tôi đã gắn nó từ một máy tính khác sau đó mất kết nối mạng). Có screenthể đang cố gắng viết vào một kết nối không còn tồn tại?
Michael Mrozek

Là quá trình màn hình chính (được gọi là SCREEN) vẫn còn sống? Nó đang làm gì ( strace)?
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


8

Không chắc chắn liệu tôi có gặp vấn đề tương tự như bạn không, nhưng đôi khi tôi có hành vi tương tự trên màn hình mỗi khi mạng của tôi bị ngắt kết nối.

Sau một thời gian (khoảng 10-15 phút) màn hình sẽ có sẵn để kết nối lại. Sau một vài lời mời, tôi đã tìm thấy một ghi chú nhỏ trong trang man:

   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.

Có thể nó sẽ giúp được ai đó, vì đây là trang duy nhất về việc đóng băng màn hình sau khi disconnetion google đưa cho tôi.


Tôi không hiểu chính xác làm thế nào dựa trên mục người đàn ông đó, nhưng điều này đã sửa nó cho tôi. Tôi đã thiết lập nonblock 5một lúc trước và lại gặp phải vấn đề này và sau 5 giây, nó đột nhiên xuất hiện bình thường
Michael Mrozek

6

Phiên màn hình của bạn có thể được treo chờ thiết bị đầu cuối giả của vỏ mà bạn gắn vào màn hình cuối cùng. Đôi khi, một kết nối bị mất để lại lớp vỏ xung quanh và màn hình phải hết thời gian để tách khỏi nó.

Nếu bạn chạy ls -l /proc/<screen_pid>/fd/<descriptor_of_hung_write>, bạn sẽ thấy rằng đó là điểm của phiên shell trước đó.

Khi bạn hủy phiên bash / shell mà bạn đã đính kèm, bạn sẽ có thể đính kèm lại.

# 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

Tôi là trường hợp này, quá trình tiêu diệt 23214 sẽ phát hành phiên màn hình và bạn có thể gắn lại.


3
Tôi nên làm gì nếu nó không có quá trình cha mẹ?
d33tah

Điều này đã giúp tôi ngày hôm nay, giết chết sshd làm cho màn hình phản ứng lại! Giờ và giờ làm việc tiết kiệm!
dùng230910

4

Màn hình đã được nâng cấp kể từ khi các phiên màn hình được bắt đầu?

Tôi không thể nhớ lại các chi tiết chính xác nhưng tôi nhớ rằng khoảng một hoặc ba tháng trước, một apt-get dist-upgrademàn hình được nâng cấp (sang debian sid) trên hệ thống của tôi và phần sau đã cảnh báo tôi về một bản nâng cấp không tương thích. Một bản sao của màn hình cũ đã được lưu giữ (ở đâu đó dưới / tmp IIRC) để cho phép gắn lại vào các phiên cũ, nhưng nên giết và khởi động lại chúng.

Các triệu chứng bạn báo cáo âm thanh tương tự như những gì tôi thấy khi tôi vô tình cố gắng kết nối lại với một phiên màn hình cũ với màn hình / usr / bin / mới.

Có thể là thế này, từ dpkg.log trở lại vào tháng 6:

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


Sự cố này đã được khắc phục trước khi Debian 7 Wheezy được phát hành. Nó mặc dù có mặt trong các bản phát hành ngược dòng hoặc ảnh chụp nhanh git. Xem bug.debian.org/683228
Axel Beckert

Điều này chỉ xảy ra với tôi hôm nay trên bản cài đặt Centos 6 cũ hơn. Cảm ơn!
Mike Andrew

Tôi vừa bị cắn bởi điều này trên Gentoo, tôi đã nâng cấp từ 4.3 lên 4.4.
jlh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.