Як відновити оболонку після відключення


37

Я займаюся деякою роботою на віддаленій машині CentOS 5.6, і моя мережа продовжує падати. Чи є спосіб я відновити свої висілі сеанси після того, як я знову підключуюся?

EDIT: я роблю деякі оновлення та установки з yum, і я переживаю, що це може бути проблемою, якщо процеси продовжують зависати посеред того, що вони роблять.


6
tmux або екран.
вересень

Відповіді:


63

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

Ось приклад.

$ tmux
$ make <something big>
......
Connection fails for some reason
Reconect

$ tmux ls
0: 1 windows (created Tue Aug 23 12:39:52 2011) [103x30]

$ tmux attach -t 0
Back in the tmux sesion

у вас немає tmux, і мені заборонено встановлювати речі, які не в моєму списку справ ...

5
@sergio Моє серце кровоточить :-)) Використовуйте screen.

4
@sergio У системі Unix практично будь-яка програма, яка не потребує кореневих дозволів для запуску, може бути встановлена ​​в одному домашньому каталозі.
Kusalananda

35

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


Добре. тепер зрозуміло.

Якщо припустити, що процес yum все ще працює (не одразу закінчився, коли оболонка отримала SIGHUP), повторного запису чи подібного може бути достатньо для відновлення процесу або - невдачі, що - отримати будь-який майбутній вихід. Оболонка, як правило, припиняється при відключенні.
Eroen

@Eroen Ви маєте на увазі, що навіть якщо використовує tmux, ОС припинить процес tmux, як тільки виявить, що з'єднання втрачено?
Доджо

@Dojo Коли з'єднання припинено, екземпляр tmux буде припинено, але сесія tmux (і оболонки, якими він керує) залишиться в режимі очікування.
Вільям Перселл

Якщо користувач втратив з’єднання з віддаленим сервером ssh, тому що, наприклад, він раптово випадково відключив кабель RJ-45, я думаю, що ssh-сервер все ще зберігає цей сеанс до заздалегідь заданого часу (наприклад, 120 секунд). Отже, чи є в цьому випадку можливість відновити цей сеанс, який залишається активним на сервері ssh протягом 120 секунд після відключення кабелю?
Ґаб 是 好人

8

Як сказав Вільям, коротка відповідь - ні, немає способу. Щоб запобігти цьому, ви можете скористатися командою екрана, перш ніж ви втратите з’єднання


з того, що я розумію, я повинен був би ініціювати yum з екраном ... welll, я didnt. я не можу повторити, це каже, що його все ще використовують, і я не хочу змусити його вбити. .. як я можу відновити контроль над запущеним ням?

і бёбу є хорошим доповненням до екрану, щоб він автоматично запускається в хорошому графічному терміналі launchpad.net/byobu

Наскільки я знаю, ви не можете, якщо не існує якихось прихованих способів перенаправити вихід з команди yum на ваш поточний сеанс семінару, але я не можу придумати його вгорі голови.
Ніколас Сміт

Існує ряд часткових рішень цього за допомогою налагоджувачів & c. щоб надати процесу нову батьківську оболонку. Reptyr - це одне, а повідомлення в блозі описує проблему, вирішення та деякі інші реалізації.
Eroen

3

Ні, ви не можете відновити оболонку після відключення. Натомість ви можете зробити так, щоб команда, яку ви виконували, продовжувала виконуватись після відключення.

Для цього використовуйте команди "nohup" і "disown", які зазвичай є вбудованими командами на більшості оболонок, тобто вам нічого не потрібно встановлювати. Це працює лише для неінтерактивних команд.

Отже, кроки будуть такими:

  1. Вхід на сервер
  2. Запустіть свою команду: "nohup sudo yum update &" (це також запише весь вихід у файл nohup.out у вашому поточному каталозі)
  3. Виконати "відхилити% 1"
  4. Не соромтеся відключатись у цей момент або чекати відключення :)

Повернувшись до сервера, просто "хвостик nohup.out", щоб побачити, як працює команда.


Не вдалося б це зробити погано в загальному випадку? Наприклад, з командами, які хочуть ввести той чи інший час ... Для повністю неінтерактивних команд це може працювати досить добре і уникати накладних витрат (і, можливо, потребувати встановлення) термінального мультиплексора.
CVn

Так, це працює лише в тому випадку, якщо ваші команди не хочуть вводити користувачів, я оновив відповідь. Загалом, термінальний мультиплексор - це безперечний шлях, але зазначалося, що додаткові інструменти не дозволялося встановлювати.
zygis

Абсолютно, це правильна відповідь, лише трохи обмежена у своїх можливих випадках використання. Підтверджено редагуванням.
CVn

3

Хтось додав репліку в коментар, а не відповідь, тому я не можу його озвучити, але це здається гарною відповіддю на відредаговане запитання і чудово працював у CentOS.

дивіться: https://github.com/nelhage/reptyr https://www.ostechnix.com/reptyr-move-running-process-new-terminal/

Чи є спосіб я відновити свої висілі сеанси після того, як я знову підключуюся?

EDIT: я роблю деякі оновлення та установки з yum, і я переживаю, що це може бути проблемою, якщо процеси продовжують зависати посеред того, що вони роблять.

Так само, я втратив віддалене з'єднання з сеансом оновлення. Тож я шукав і знайшов це запитання ... потім знову підключив і використав екран:

  1. відновити ssh
  2. екран
  3. встановіть рептирій за посиланнями вище
  4. пс -а | греп ням
  5. рептир psid

і там я за підказкою, яку ви давали кілька годин раніше.

Технічно відповіді вірні, це НЕ відновлення висілої сесії, це перетворення сирітського процесу на поточний сеанс. І дуже корисно це теж ...


1

Як багато людей запропонували, screenі tmuxобидва вони підтримують основну функціональність, але мають чіткі специфічні особливості, тому не можна сказати, що один перевершує інший у всіх випадках. Наприклад, лише tmux підтримує розділення вікон , тоді як лише екран GNU може змінювати обгортання довгих ліній (Ctrl + ar). Детальніше порівняння дивіться тут .

Існують також інструменти, спеціально для вирішення цієї проблеми ssh:

Autossh - це програма для запуску копії ssh та відстеження її, перезапуск її за необхідності у разі загибелі або припинення проходження трафіку. Ідея від rstunnel.

Mosh - це віддалений термінальний додаток, який дозволяє роумінгу, підтримує переривчасте підключення та забезпечує інтелектуальне локальне відлуння та редагування рядків натискань клавіш користувача. Mosh - це заміна SSH. Він більш надійний і чуйний, особливо через Wi-Fi, стільникові та міжміські зв’язки.


-1

Це можна зробити за допомогою tmuxоболонки. Якщо вас відключили, найшвидший спосіб повторного приєднання сеансу:

tmux a #0

Це нічого не додає, що прийнята відповідь не говорить. Він також передбачає, що користувач вже працює tmuxсеанс.
Kusalananda

2
Це може бути коментар на цю відповідь кажуть «ви можете скорочуйте , attachяк a».
Джефф Шаллер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.