Як підключитися до втраченого екрана (відокремлений, відсутній розетку)?


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перевіряє фіфо / розетку щоразу, коли отримує SIGCHLDсигнал. Якщо розетка відсутня, вона буде відтворена. Тож рішення - знайти процес і надіслати його SIGCHLD.

У моїй системі Debian, screenсхоже, встановлено як setgid, utmpале не налаштовано, тому перше рішення із поширених запитань нижче працює:

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

У системах, де екран встановлений налаштовано root, це не працюватиме, і вам потрібно буде вбити один з дочірніх процесів активного сеансу на екрані, щоб змусити ядро ​​надсилати сигнал для вас. Це означає принести в жертву одне з ваших екранів, щоб знову з'єднатися з рештою (вибирайте з розумом!).

З архівованого FAQ Gentoo Wiki :

Розетка відсутня

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

Питання: З незрозумілої причини файлу fifo в / tmp / екранах / S-імені немає, і я не можу відновити сеанс екрана. Чи є спосіб відтворити фіфо?

A: Екран перевіряє фіфо / сокет кожного разу, коли він отримує сигнал SIGCHLD. Якщо цього немає, то відтворюється фіфо / сокет.

Якщо екран працює без встановленого режиму, користувач може kill -CHLD screenpidбезпосередньо видати його (він є -CHILDв деяких системах). Screenpid - ідентифікатор процесу екранного процесу, знайденого у ps -xсписку.

Але зазвичай це не спрацює, оскільки на екрані повинен бути встановлений встановлений корінь. У цьому випадку ви не зможете надіслати йому сигнал, але ядро ​​буде. Це робиться кожен раз, коли дитина, що перебуває на екрані, змінює свій стан. Знайдіть ідентифікатор процесу (shellpid нижче) "найменш важливої" оболонки, що працює на екрані. Спробу kill -STOP shellpid. Якщо фіфо / розетка не з’являється знову, руйнуйте процес оболонки. Ви жертвуєте однією оболонкою, щоб зберегти решту. Якщо нічого не працює, не забудьте видалити всі процеси, запущені в сеансі втраченого екрана.

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