Команда відновити запуск у спадному сеансі SSH


32

Читання цього питання змусило мене замислитися . Припускаючи screen, що не використовується. Якщо сеанс SSH для цілі Linux випаде з будь-якої причини, і ви знову підключитесь до того, як сервер вбиває сеанс через тайм-аут, чи можливо відновити контроль над запущеною командою, щоб вона не була перервана через зламану сесію ?


Яка команда це? Я здогадуюсь, як правило, відповідь - ні.
дав

Ніякої конкретної команди, я просто запитую як загальну концепцію.
Джон Гарденєр

1
Хтось із всебічним розумінням того, як ініціалізуються три тижні сеансів, може розказати нам як. Схоже, якщо ви могли б відтворити новий сеанс на тій же tty і явно призначити попередній PPID, це могло б бути можливим. Я просто чекаю, коли якийсь бородатий нікс-гуру зійде і підірве нам розум. Це будь-який сон.
CarpeNoctem

Що станеться, якщо експериментувати з прив’язаним ноутбуком і витягнути шнур Ethernet?
Пол

@ ~ drpaulbrewer - Точно так само, як коли ви робите це з настільною машиною - з'єднання припиняється. Як увімкнено зв’язок, питання не має значення.
Джон Гарденєр

Відповіді:


13

Спроба підключити поточний дескриптор файлів STD * нового терміналу до старого запущеного процесу просто вимагає неприємностей. Навіть якщо вам це вдасться зробити, контроль роботи терміналу не працюватиме так, як очікувалося. У вас залишиться безлад, якщо ви врешті-решт вийдете з програми, що приймається, і що станеться з оболонкою, яка принесла в жертву її дескриптори файлів, щоб бути передані новоспеченому процесу. Чи залишиться ssh відкритим, коли ця оболонка піде? Напевно, ні. Тому спочатку вам потрібно буде перенаправити його десь ще.

Можливо, чи ні, я б став на загрозу, що більш бажано просто відпустити покинутий процес "природним шляхом". Якщо ви робите щось досить важливе для виправдання спроб зробити весь хакер, необхідний для відновлення контролю, і ви перебуваєте на нестабільному посиланні, ви, мабуть, знаєте це заздалегідь і просто користуєтеся екраном (або vnc, або будь-яким іншим плаваючим вашим відокремленим, човен управління). :)


Мені важко вибрати відповідь, яку слід прийняти, тому я приймаю цю, тому що наразі це єдиний відгук.
Джон Гарденєр

5

Я знаю, що це старе питання, але я вважав, що важливо додати свої висновки, якщо хтось інший натрапив на це, як я.

Я не бачив жодних незвичних наслідків для цього, але це я використовував, і це спрацювало дивовижно. Іноді, коли ми запускаємо тривалі процеси на нашому сервері, він час від часу відключає сеанс ssh. Процес разом із сеансом tty продовжується, але ми не можемо з ним знову підключитися. Я знайшов програму нижче, щоб підтягнути процес до нещодавно підключеного сеансу.

https://github.com/nelhage/reptyr

Ось додаткова інформація

https://blog.nelhage.com/2011/02/changing-ctty/


5
Ласкаво просимо до помилки сервера! Хоча це теоретично може відповісти на питання, бажано було б сюди включити істотні частини відповіді та надати посилання для довідки.
EEAA

дякую, @ user215086! Дивно, але це спрацювало! Я деякий час редагував довгий конфігураційний файл, додав купу спеціальних налаштувань і ретельно написані коментарі, і майже закінчився, коли з'єднання перестало! "Noooooo !! ..." Після того, як я прокричав нецензурну лайку під стелею, я встановив reptyr, et voila! Я відновив сеанс ssh прямо там, де я залишив його всередині редактора, закінчив кілька речей, врятував, зробив !! WooHoo! рептирій - приголомшливий.
ColdCold

4

Як правило, правильним способом впоратися з цим є підготовка до цього заздалегідь, використовуючи GNU screenабо bash's nohupабо disownмеханізми. Якщо ви використовуєте tcsh, оболонка відключить фонові завдання, коли вона закінчується ненормально.

Якщо ви не використовуєте, screenале вам вдалося зберегти процес за допомогою одного з методів відмови , можливо, ви зможете підробити підключення до процесу за допомогою gdb( джерело ):

[...] з деякими брудними хаками неможливо відновити процес 'stdout / stderr / stdin. [...]

А потім використовуйте gdb, наприклад, для приєднання до процесу, виконайте кілька закритих викликів (0)
закриття виклику (1)
закриття дзвінка (2)
виклик відкритим ("/ dev / pts / xx", ...)
виклик dup (0)
виклик дуп (0)
від'єднання

Тепер вам доведеться налаштувати цей процес на вашу ситуацію. Сумніваюся, це допоможе, якщо вам не вдалося відмовитись від процесу. Якщо ви використовуєте bash, побачити цей пост про те , щоб Баш автоматично відхрестився фонові процеси на виході ( в основному, вимкніть huponexit з shopt ). У процесі переднього плану потрібно використовувати ногуп .


1

Напевно, ні. Я не можу гарантувати, що це неможливо, але я дуже сумніваюся в цьому.

Одне - це відсутність вбивства оболонки та можливих команд, що виконуються як наслідок припинення ssh-з'єднання. Це не так складно, ви повинні мати можливість використовувати ногуп та подібні механізми, як зазначено в іншому питанні.

Але тоді, припустимо, ви почали ssh somehost nuhup vim /some/fileі з'єднання вмирає. Ви запускаєте ssh somehostзнову входити в систему і бачите, що процес vim все ще працює. Але так, як ви знову підключитесь до цього процесу? В інтерактивних процесах forground є контрольний tty, а той, відкритий для вашого vim-процесу, коли він розпочався, відтоді був би закритий. Я не впевнений, чи є який-небудь спосіб "повторно відкрити" його у вашій новій оболонці (так само, як якщо у вас є кілька фонових завдань, що працюють в одній оболонці, ви не можете передбачити жодного з іншого в оболонці).

Screenявно написано, щоб мати цю функціональність. При запуску він розщеплює два процеси, процес управління терміналом і клієнтський процес. Взаємодія - це програма клієнта <--> менеджер терміналів <-->, і коли ви відриваєтесь або втрачаєте зв’язок, клієнтський процес гине, поки менеджер терміналів продовжує жити. На екрані є певна підтримка, щоб згодом знову долучитись до процесу управління терміналами, і я не думаю, що це можливо в загальному випадку.


Спасибі. Це майже те, що я очікував. Подивимось, чи може хтось довести нас неправильно. ;)
Джон Гарденєр

З моменту написання цієї відповіді я дізнався, що існує програмний переповнювач для процесів "перезаписування". Отже, теоретично це можливо, але я все ще думаю, що загальна відповідь, мабуть, ні.
hlovdal


1

Якщо сеанс припинено, це означає, що термін TTL вже закінчився, тому для вас більше немає tty (наскільки я це розумію). Але якщо ваш мережевий зв’язок перерваний, сеанс SSH може не потребувати перерви, і вам слід мати змогу відновити з’єднання та продовжити. Це те, про що ви питаєте?


Я запитував взагалі, але мене найбільше цікавить, коли проблема з мережею спричиняє падіння зв’язку. В цілому, я б сказав, що це виглядає не надто добре. І все-таки це запитували лише з цікавості, а не з потреби. Завжди приємно знати відповідь, перш ніж вона вам потрібна. ;)
Джон Гарденєр

перерване з'єднання - це не так просто поняття, як здається. Ви можете відчути кілька різних етапів цього. Наприклад, вам слід мати змогу відключити мережевий кабель, підключити його через пару секунд, і ваш сеанс SSH залишиться в режимі очікування, вам не доведеться повторно підключатися, щоб продовжувати, хоча у вас може виникнути невелика початкова затримка. Якщо ви потрапили на сеанс убитого ssh, це означає, що щось неправильно налаштовано (а точніше, не налаштовано належним чином, щоб підтримувати подібні збої).
мономіт

0

У цьому питанні було посилання на якийсь хакі ттей-крадіжки . Теоретично ви повинні мати можливість використовувати це, щоб відновити контроль над процесом nohup.


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