21

У меня был сеанс 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 . Как я могу присоединиться к моей сессии?

1 ответ1

27

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

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

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

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

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

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

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

Q: По какой-то неизвестной причине, 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 не появится снова, уничтожьте процесс оболочки. Вы жертвуете одну раковину, чтобы спасти остальные. Если ничего не работает, пожалуйста, не забудьте удалить все процессы, запущенные в сеансе потерянного экрана.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .