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