जीएनयू स्क्रीन रिजेक्ट करने की कोशिश करता है


16

मेरे पास कई लंबे समय से चल रहे जीएनयू स्क्रीन सत्र हैं। मैं उस बॉक्स पर 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

अपने ~ / .स्क्रीनrc (और शायद / etc / screenrc पोस्ट अगर यह अनुकूलित है)
पोस्टिंग

कृपया strace screen -d -r foo(आप screenनिष्पादन योग्य के एक गैर-सेट [बदसूरत आईडी आईडी) बनाने की कोशिश करें ) और strace -p$(pidof SCREEN)एक असफल पुनरावृत्ति के समय के आसपास पोस्ट करें।
गिल्स एसओ- बुराई को रोकना '

@ गिल्स यह बस फिर से हुआ; मैंने straceलॉग जोड़ा । straceएक में एक ऐसी ही ब्लॉक ing मुख्य स्क्रीन प्रक्रिया से पता चलता है write()कॉल
माइकल Mrozek

ऐसा तब होता है जब पहले से कनेक्ट की गई स्क्रीन को सफाई से डिस्कनेक्ट नहीं किया गया था (इस मामले में मैंने इसे किसी अन्य कंप्यूटर से जोड़ा था जो तब अपना नेटवर्क खो गया था)। screenएक कनेक्शन है कि अब मौजूद नहीं है लिखने के लिए कोशिश कर रहा हो सकता है?
माइकल Mrozek

क्या मुख्य स्क्रीन प्रक्रिया (जिसे कहा जाता है SCREEN) अभी भी जीवित है? यह क्या कर रहा है ( strace)?
गिल्स एसओ- बुराई को रोकना '

जवाबों:


8

यकीन नहीं होता है कि अगर मेरे पास आपके जैसा ही मुद्दा था, लेकिन कभी-कभी मैं समान स्क्रीन व्यवहार करता हूं, तो हर बार जब मैं नेटवर्क से डिस्कनेक्ट किया गया था।

थोड़ी देर के बाद (लगभग 10-15 मिनट) स्क्रीन फिर से फिर से जुड़ने के लिए उपलब्ध है। कुछ अशुभताओं के बाद, मुझे मैन पेज में एक छोटा नोट मिला है:

   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.

हो सकता है कि यह किसी की मदद करे, क्योंकि डिस्कनेक्ट गूगल द्वारा मुझे दिए जाने के बाद स्क्रीन फ्रीज के बारे में यह एकमात्र पेज है।


मुझे ठीक से समझ नहीं आ रहा है कि उस आदमी की पेज प्रविष्टि पर आधारित कैसे हो, लेकिन इसने मेरे लिए इसे ठीक कर दिया। मैं सेट nonblock 5कुछ समय पहले, और फिर से इस मुद्दे की जांच सिर्फ चलाते थे और 5 सेकंड के बाद यह अचानक सामान्य रूप से संलग्न
माइकल Mrozek

6

आपका स्क्रीन सत्र संभवतः उस शेल के छद्म टर्मिनल की प्रतीक्षा में लटका हुआ है जिसे आपने पिछली बार स्क्रीन के साथ जोड़ा था। कभी-कभी एक खोया हुआ कनेक्शन उस शेल को छोड़ देता है और स्क्रीन को उससे अलग होने के लिए समय समाप्त करना पड़ता है।

यदि आप चलाते हैं ls -l /proc/<screen_pid>/fd/<descriptor_of_hung_write>, तो आपको यह देखना चाहिए कि यह पिछले शेल सत्र के लिए pts है।

एक बार जब आप अपने साथ संलग्न किए गए बैश / शेल सत्र को मार देते हैं, तो आप पुनः संलग्न कर पाएंगे।

# 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

मैं इस मामले में, २३२१४ की हत्या की प्रक्रिया स्क्रीन सत्र जारी कर दूंगा और आप इसे पुनः प्राप्त कर सकते हैं।


3
अगर इसकी कोई मूल प्रक्रिया नहीं है तो मुझे क्या करना चाहिए?
d33tah

इसने मेरे लिए आज मदद की, sshd की हत्या ने स्क्रीन को फिर से उत्तरदायी बना दिया! घंटे और काम के घंटे बच गए!
user230910

4

क्या उन स्क्रीन सत्रों को शुरू करने के बाद स्क्रीन को अपग्रेड किया गया है?

मैं सटीक विवरणों को याद नहीं कर सकता, लेकिन मुझे याद है कि लगभग एक या तीन महीने पहले, apt-get dist-upgradeमेरे सिस्टम पर ( ए डिबियन साइड) अपग्रेड की गई स्क्रीन और पोस्टस्टीन ने मुझे असंगत अपग्रेड के बारे में चेतावनी दी थी। पुराने सत्रों को पुन: व्यवस्थित करने के लिए पुराने स्क्रीन की एक प्रति (कहीं न कहीं / tmp IIRC के तहत) रखी गई थी, लेकिन उन्हें मारने और फिर से शुरू करने की सिफारिश की गई थी।

आपके द्वारा बताए गए लक्षणों के समान ध्वनि। जब मैंने गलती से नए / usr / बिन / स्क्रीन के साथ एक पुराने स्क्रीन सत्र को फिर से जोड़ने की कोशिश की।

संभवतः यह जून में dpkg.log से वापस आ गया था:

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


यह मुद्दा डेबियन 7 व्हीजे जारी होने से पहले तय किया गया था। यह हालांकि अपस्ट्रीम रिलीज या गिट स्नैपशॉट के अनुसार मौजूद है। देखें bugs.debian.org/683228
एक्सल बेकर्ट

यह सिर्फ मेरे लिए आज एक पुराने Centos 6 स्थापित पर हुआ। धन्यवाद!
माइक एंड्रयूज

मुझे जेंटू पर बस काट लिया गया था, मैं 4.3 से 4.4 पर अपग्रेड कर रहा था।
jlh
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.