Неможливо повторно приєднатись до екранного сеансу після відключення з'єднання SSH


16

Я раніше приєднався до тривалого сеансу роботи з екраном screen -dr control. Однак іноді ця команда не повторно приєднається до екрану, а замість цього вічно повісить (10+ хвилин, після чого я зробив перерву). Це відбувається лише тоді, коли з'єднання SSH несподівано перестане, а не тоді, коли екран належним чином від'єднаний Ctrl-A d. Інші перемикачі, такі як screen -xабо screen -D -RRтеж не працюють.

Цей пост пропонує вбити PTY, який проводить сеанс екрана, що призведе до того, що екран завершить його відключення. Однак він просто вбиває оболонку, з якої screen -dr controlбув викликаний.

Наприклад:

$ ps -ef | grep control | grep -v grep
nomad     7387  7109  0 13:05 pts/50   00:00:00 screen -dr control
nomad    15299     1  0 Nov27 ?        00:13:47 SCREEN -S control

$ ps -ef | grep bash | grep 'pts/50'
nomad     7109  7108  0 12:49 pts/50   00:00:00 -bash

Пов’язаний пост пропонує вбити bashпроцес із PID 7109. Це також знищить screen -dr controlпроцес із PID 7387. Згодом я все ще не можу підключитися до екрана.

Процес, SCREEN -S controlякий розпочав сеанс екрана, є initйого батьківським, і я, очевидно, не можу вбити.

Чи є спосіб повторного приєднання до сеансу на вивішеному екрані?

Оновлення: це відбувається на CentOS 6.4 за допомогою ядра 2.6.32-358.6.1.el6.x86_64. Снаряди - це bash версія 4.1.2 (1) -випуск.


3
Що screen -lsговорить у тих "висячих" випадках? screen -d -r <session>означає "від'єднати та відновити", тому не від'єднувати його з перших рук не має значення. (І робити це часто, це не так ...)
mveroone

Спробуйте запустити lsof на екрані, перевірте, чи щось "застрягло". Екран використовує unix-сокет для зв'язку між процесами, ймовірно, щось залишило його відкритим. Також переконайтесь, що сокет не видалено або його право власності чи щось. Загалом, ви також повинні включити, яку ОС та версію ви використовуєте, хоча я не маю на увазі нічого конкретного, що могло б залежати від цього часу.
Dan Pritts

3
Ви ssh'ing через інший хоп, наприклад, використовуючи netcat як проксі-команду? У цьому випадку у мене виникла проблема, коли ssh-з'єднання до першого вікна падає, але команда netcat proxy залишає відкритим ssh-з'єднання 'другого'. -d повинен працювати, однак.
Єнс Тіммерман

Jens, ваша порада зробила свою справу. Я дійсно проксі через netcat і вбивство його на проміжному хості дозволило мені знову приєднатися до екрана.
Віктор Розенфельд

Чому ви хочете вбити батьківський процес вивішеного екрана? Ви хочете вбити саму команду, що додає екран. №7387 у вашому випадку.
Маттіас Урліхс

Відповіді:


6

Я думаю, ви повинні спробувати

screen -DR 

і в наступний раз - виклик гнівного (верхнього регістру) повинен змусити його відключити той інший сеанс, який проводить ваш проміжний мережевий хоп.


Я спробував це, не виходить. Вбивство проксі-сервера netcat робить свою справу.
Віктор Розенфельд

Дивно. Це повинно. Що відбувається натомість?
Маттіас Урліхс

Всі подальші виклики екрана (-dr, -x, -DR) навішуються назавжди. Після того, як я вбив проксі-сервер netcat, ці виклики знову працюють.
Віктор Розенфельд

1

Як запропонував Єнс Тіммерман, остаточною причиною цієї дивної поведінки було те, що я підключався до віддаленого сервера за допомогою SSH ProxyCommand та ncat. Після вбивства ncatна проміжній машині я можу повторно приєднатися до екранного сеансу.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.