Итак, я запускал apt-get upgrade
на сервере, когда маршрутизатор решил, что прошло слишком много времени с тех пор, как он в последний раз меня разозлил: он разорвал все соединения. Мораль этой истории - много использовать screen
, когда вы используете Bum Router.
Как бы то ни было, я снова вошел в систему и обнаружил в htop, что процесс все еще зависает там, все еще ожидая, пока мой Y / n обновится (к счастью, еще не нажал). Можно ли как-нибудь присоединиться к сеансу, который был прерван? В итоге я просто убил его, так как он не был в центре управления пакетами, но было бы здорово узнать об этом в будущем.
Ответ на ваш правильный вопрос: вы не можете . Думаю, основная проблема в том, что процедуры аутентификации будут рассинхронизированы.Это просто не работает.
Как вы сами заметили, решение состоит в том, чтобы по возможности использовать screen (кстати, tmux является альтернативой screen).
Пока вы не можете повторно подключившись к прерванному сеансу SSH, вы можете заново родить процесс, выполняющийся внутри SSH - функционально эквивалентно тому, что вы хотите.
В вашем случае вы должны взять на себя apt- получить процесс
для управления из сеанса нового SSH, сеанса экрана
и т.п. Мне больше всего нравится команда reptyr
:
$ sudo apt-get install reptyr
$ ps ax | grep apt-get
10626 pts/8 R+ 0:32 apt-get upgrade
Затем, используя pid, который вы нашли для своего процесса:
$ sudo reptyr -T 10626
Или, если это не сработает, попробуйте:
$ reptyr 10626
После этого этапа все ваши ввод с клавиатуры переходит в программу, которую вы взяли на себя. К сожалению, вы не увидите старый вывод сеанса SSH, такой как вывод apt-get
с запросом подтверждения.
Есть несколько других инструментов, которые в основном работают так же, как ] reptyr
(то есть через ptrace
отладочное вложение). См. Следующие вопросы и ответы, где они обсуждаются:
В приведенных выше инструкциях, reptyr 10626
использует вложение отладки ptrace
, тогда как команда sudo reptyr -T 10626
использует кражу TTY и является предпочтительной ( подробности ).
Наконец, причина, по которой вы не можете управлять сеансом SSH таким образом, заключается в том, что процесс sshd
не контролируется терминалом хоста, а предоставляет подчиненную часть терминала - устройство pts
, в то время как главная часть, управляющая им, находится на клиентской машине, здесь с разделенным сеансом SSH между ними. Когда вы принудительно выполняете такой процесс sshd
с помощью reptyr -s
, ввод с клавиатуры передается этому процессу, а не его активному дочернему процессу. Таким образом, «Ctrl + Z» просто убьет этот sshd
.
Для запуска длительных процессов я использую screen или byobu , если вам нужен более удобный интерфейс.
Для экрана вы можете использовать:
screen [program] [args]
Это запустит [программу] и ее [аргументы] внутри экрана сеанс. После завершения программы сеанс автоматически закрывается. Если вы хотите сохранить сеанс после запуска вашей программы, просто запустите screen без каких-либо аргументов, и внутри сеанса появится новое приглашение. CTRL + A + D отключает терминал от текущего сеанса.
Чтобы повторно подключиться к предыдущему сеансу:
screen -r
Если открыт только один сеанс, он немедленно подключится повторно. Если продолжается несколько сеансов, он спросит вас, к какому из них вы хотите подключиться. Если вы знаете имя сеанса, вы можете просто добавить его в качестве аргумента в эту командную строку.
Byobu - хорошее улучшение. Он основан на экране , но имеет панель внизу, которая показывает все текущие сеансы в виде вкладок и дает более удобные ярлыки для их перемещения. Вы можете:
СЛОВО СОВЕТА : не оставляйте сеанс открытым с пользователем root . Если кто-либо получит доступ к вашему терминалу (локально или удаленно), он может легко повторно подключиться к текущему сеансу и использовать вашу систему как root. При необходимости лучше начать сеанс с использованием обычного пользователя и sudo отдельных командных строк, если необходимо.
Я выполнял do-dist-upgrade
через ssh с портативного компьютера, который перешел в режим ожидания, отсюда Сломанный канал
. Вернувшись в машину, я увидел, что процессы, связанные с обновлением, все еще выполняются, среди которых whiptail
, запрашивающий у меня ввод (какой диспетчер отображения выбрать) и, соответственно, принадлежащий пользователю root ЭКРАН
. Я смог выполнить sudo su -
и screen -r
, чтобы присоединиться к сеансу, и, о чудо, у меня есть диалоговое окно с хвостиком, которое может вводить данные. Я смог без проблем возобновить обновление.
Примечание: это было обновление с Ubuntu 14.04 до 16.04.