Как подключиться к потерянному экрану (отсоединен, отсутствует розетка)?

23

У меня был screenсеанс, работающий на домашнем сервере. Моя рабочая станция нуждалась в перезагрузке, поэтому я отключил и убил терминал. После повторного подключения к серверу я выполняю свой типичный

$ screen -D -R
[new screen]

А? Нет, не новая сессия, дай мне старую. Я знаю, я возьму это напрямую. Как называется сокет?

$ screen -list
No Sockets found in /var/run/screen/S-username

$ ls -a /var/run/screen/S-username
.  ..

Чего ждать? Я знаю, что оставил это запущенным. Куда это делось?

$ ps -ef | grep -i screen
username  30860     1  0 Oct16 ?        00:00:29 SCREEN

Ну, есть процесс. Но нет гнезда для перехода screen -r. Как я могу присоединиться к моей сессии?

шарлатан
источник

Ответы:

28

Screenпроверяет fifo / сокет всякий раз, когда он получает SIGCHLDсигнал. Если сокет отсутствует, он будет воссоздан. Таким образом, решение состоит в том, чтобы найти процесс и отправить его SIGCHLD.

В моей системе Debian, screenпохоже, установлен как setgid, utmpно не setuid, поэтому первое решение из приведенного ниже FAQ сработало:

$ kill -CHLD 30860
$ ls /var/run/screen/S-username/
30860.pts-4.localhost

В системах, где установлен экран setuid root, это не сработает, и вам нужно будет завершить один из дочерних процессов активного сеанса экрана, чтобы заставить ядро ​​отправить вам сигнал. Это значит пожертвовать одним из окон вашего экрана, чтобы восстановить связь с остальными (выбирайте мудро!).

Из архивного FAQ по Gentoo Wiki :

Сокет отсутствует

Иногда сокет все еще работающего экрана может быть уничтожен, хотя сам процесс и все его дочерние процессы все еще работают. Экран-список будет отображать «Не найдены сокеты в / tmp / uscreens / ..». Некоторые полезные инструкции о том, как решить эту проблему (и некоторые другие необычные проблемы) на http://www4.informatik.uni-erlangen.de/ ~ jnweiger / screen-faq.html # MISC примерно на 2/3 пути вниз.

В: По какой-то неизвестной причине, fifo в / tmp /screen / S-myname пропал, и я не могу возобновить сеанс экрана. Есть ли способ воссоздать fifo?

A: Экран проверяет fifo / сокет всякий раз, когда он получает сигнал SIGCHLD. Если отсутствует, fifo / socket воссоздается тогда.

Если экран работает без set-uid, пользователь может выдать его kill -CHLD screenpidнапрямую ( -CHILDв некоторых системах). Screenpid - это идентификатор процесса, найденного в ps -xлистинге.

Но обычно это не работает, так как на экране должен быть установлен setuid root. В этом случае вы не сможете отправить ему сигнал, но ядро ​​будет. Это происходит всякий раз, когда дочерний элемент экрана меняет свое состояние. Найдите идентификатор процесса (shellpid ниже) «наименее важной» оболочки, работающей внутри экрана. Попробуй kill -STOP shellpid. Если fifo / socket не появляется снова, уничтожьте процесс оболочки. Вы жертвуете одну раковину, чтобы спасти остальные. Если ничего не работает, пожалуйста, не забудьте удалить все процессы, запущенные в сеансе потерянного экрана.

шарлатан
источник