Поиск по сайту:

5 способов сохранить удаленные сеансы SSH и процессы после отключения


SSH или Secure Shell, проще говоря, — это способ, с помощью которого человек может удаленно получить доступ к другому пользователю в другой системе, но только в командной строке, то есть в режиме без графического интерфейса. Говоря более техническим языком, когда мы подключаемся по SSH к другому пользователю в какой-либо другой системе и запускаем команды на этом компьютере, он фактически создает псевдотерминал и прикрепляет его к оболочке входа вошедшего в систему пользователя.

Когда мы выходим из сеанса или время сеанса истекает после длительного простоя, сигнал SIGHUP отправляется на псевдотерминал и все задания, которые были запущены на этом терминале, даже задания, родительские задания которых инициируются на псевдотерминале, также получают сигнал SIGHUP и принудительно завершаются.

Не пропустите: 5 полезных советов по обеспечению безопасности и защиты SSH-сервера

Только задания, настроенные на игнорирование этого сигнала, остаются в живых после завершения сеанса. В системах Linux у нас может быть много способов запустить эти задания на удаленном сервере или любом компьютере даже после выхода пользователя из системы и завершения сеанса.

Понимание процессов в Linux

Нормальный процесс

Нормальные процессы — это те, которые имеют продолжительность жизни сеанса. Они запускаются во время сеанса как процессы переднего плана и заканчиваются через определенный промежуток времени или при выходе из сеанса. Владельцем этих процессов является любой действительный пользователь системы, включая root.

Сиротский процесс

Сиротские процессы — это процессы, у которых изначально был родительский процесс, создавший процесс, но через некоторое время родительский процесс непреднамеренно прекратил работу или произошел сбой, в результате чего init стал родительским процессом этого процесса. Такие процессы имеют init в качестве непосредственного родителя, который ожидает эти процессы, пока они не умрут или не закончатся.

Демонический процесс

Это некоторые намеренно потерянные процессы. Такие процессы, которые намеренно оставлены работающими в системе, называются демонами или намеренно потерянными процессами. Обычно это длительные процессы, которые однажды инициируются, а затем отключаются от любого управляющего терминала, чтобы они могли работать в фоновом режиме до тех пор, пока не завершатся или не выдадут ошибку. Родитель таких процессов намеренно умирает, заставляя дочерний процесс выполняться в фоновом режиме.

Методы сохранения сеанса SSH после отключения

Существуют различные способы оставить сеансы ssh работающими после отключения, как описано ниже:

1. Использование экранной команды для поддержания сеансов SSH

screen — это текстовый оконный менеджер для Linux, который позволяет пользователю одновременно управлять несколькими сеансами терминала, переключаться между сеансами, вести журнал сеансов для текущих сеансов на экране и даже возобновлять сеанс в любое время, когда мы пожелаем. не беспокоясь о выходе из сеанса или закрытии терминала.

Сеансы экрана можно запускать, а затем отключать от управляющего терминала, оставляя их работать в фоновом режиме, а затем возобновлять в любое время и даже в любом месте. Вам просто нужно запустить сеанс на экране и, когда захотите, отсоединить его от псевдотерминала (или управляющего терминала) и выйти из системы. Когда вы почувствуете, вы можете повторно войти в систему и возобновить сеанс.

Запуск сеанса экрана

После ввода команды 'screen' вы попадете в новый сеанс экрана. В рамках этого сеанса вы сможете создавать новые окна, перемещаться между окнами, блокировать экран и делать множество других вещей, которые вы можете делать на обычный терминал.

screen

После запуска сеанса экрана вы можете запустить любую команду и продолжить работу сеанса, отключив его.

Отсоединение экрана

Когда вы хотите выйти из удаленного сеанса, но хотите сохранить сеанс, созданный вами на этом компьютере, тогда вам нужно просто отсоединить экран от терминала, чтобы на нем не осталось управляющего терминала. После этого вы можете безопасно выйти из системы.

Чтобы отсоединить экран от удаленного терминала, просто нажмите «Ctrl+a», а затем «d», и вы вернетесь к терминалу, увидев сообщение о том, что экран является обособленным. Теперь вы можете безопасно выйти из системы, и ваша сессия останется активной.

Возобновление сеанса отключенного экрана

Если вы хотите возобновить сеанс отдельного экрана, который вы покинули перед выходом из системы, просто повторно войдите в удаленный терминал и введите “screen -r ” в случае, если открыт только один экран, а также если несколько сеансы экрана открываются, запустите “screen -r .

screen -r
screen -r <pid.tty.host>

Чтобы узнать больше о команде screen и о том, как ее использовать, просто перейдите по ссылке: Используйте команду screen для управления сеансами терминала Linux.

2. Использование Tmux (терминального мультиплексора) для поддержания сеансов SSH

Tmux — еще одно программное обеспечение, созданное для замены screen. Он обладает большинством возможностей screen, но имеет несколько дополнительных возможностей, которые делают его более мощным, чем screen.

Он позволяет, помимо всех опций, предлагаемых screen, разделять панели по горизонтали или вертикали между несколькими окнами, изменять размер оконных панелей, отслеживать активность сеанса, создавать сценарии с использованием режима командной строки и т. д. Благодаря этим функциям tmux он получил широкое распространение почти во многих странах мира. все дистрибутивы Unix и даже он был включен в базовую систему OpenBSD.

Начать сеанс Tmux

Выполнив ssh на удаленном хосте и набрав tmux, вы войдете в новый сеанс, и перед вами откроется новое окно, в котором вы сможете делать все, что делаете на обычном терминале.

tmux

После выполнения операций на терминале вы можете отсоединить этот сеанс от управляющего терминала, чтобы он перешел в фоновый режим, и вы могли безопасно выйти из системы.

Отключить сеанс Tmux от терминала

Вы можете либо запустить “tmux detach ” при запуске сеанса tmux, либо использовать ярлык (Ctrl+b, затем d). После этого ваш текущий сеанс будет отключен, и вы вернетесь к своему терминалу, откуда сможете безопасно выйти из системы.

tmux detach

Возобновление закрытого сеанса Tmux

Чтобы повторно открыть сеанс, который вы отсоединили и оставили как есть при выходе из системы, просто повторно войдите на удаленный компьютер и введите “tmux Attach”, чтобы повторно подключиться к закрытому сеансу, и он будет все еще там и работать.

tmux attach

Чтобы узнать больше о tmux и о том, как его использовать, просто перейдите по ссылке: Используйте мультиплексор терминала Tmux для управления несколькими терминалами Linux.

3. Использование команды nohup для продолжения сеансов SSH

Если вы не очень знакомы с screen или tmux, вы можете использовать nohup и отправить свою длительную команду в фоновый режим, чтобы вы могли продолжить, пока команда продолжит выполняться в фоновом режиме. После этого вы можете безопасно выйти из системы.

С помощью команды nohup мы сообщаем процессу игнорировать сигнал SIGHUP, который отправляется сеансом ssh при завершении, таким образом, команда сохраняется даже после выхода из сеанса. При выходе из сеанса команда отделяется от управляющего терминала и продолжает работать в фоновом режиме как процесс-демон.

Выполнение команды с использованием nohup в фоновом режиме

Вот простой сценарий, в котором мы запустили команду find для поиска файлов в фоновом режиме в сеансе ssh с использованием nohup, после чего задача была отправлена в фоновый режим с немедленным возвратом приглашения с указанием PID и задания ID процесса ([JOBID] PID).

nohup find / -type f $gt; files_in_system.out 2>1 &

Возобновление сеанса, чтобы проверить, выполняется ли задание.

При повторном входе в систему вы можете проверить статус команды, вернуть ее на передний план, используя 'fg %JOBID', чтобы отслеживать ее ход и так далее. Ниже выходные данные показывают, что задание было завершено, поскольку оно не отображается при повторном входе в систему, и выдали отображаемый результат.

fg %JOBID

4. Использование команды disown для поддержания работы SSH-сессий

Еще один элегантный способ позволить вашей команде или отдельной задаче выполняться в фоновом режиме и оставаться активными даже после выхода из сеанса или отключения от него — использовать disown.

Disown удаляет задание из списка заданий процесса системы, поэтому процесс защищен от завершения во время отключения сеанса, поскольку он не будет получать SIGHUP от оболочки при вы выходите из системы.

Недостаток этого метода заключается в том, что его следует использовать только для заданий, которым не требуется ввод данных из stdin и не требуется запись в stdout, если только вы специально не перенаправите ввод и вывод заданий, поскольку, когда задание попытается взаимодействовать с stdin или stdout, оно остановится.

Выполнение команды с использованием Disown в фоновом режиме

Ниже мы отправили команду ping в фоновый режим, чтобы ut продолжал работать и был удален из списка заданий. Как видно, задание сначала было приостановлено, после чего оно все еще оставалось в списке заданий под именем Идентификатор процесса: 15368.

ping linux-console.net > pingout &
jobs -l
disown -h %1
ps -ef | grep ping

После этого сигнал отклонения был передан заданию, и оно было удалено из списка заданий, хотя все еще выполнялось в фоновом режиме. Задание все равно будет выполняться, когда вы повторно войдете в систему на удаленном сервере, как показано ниже.

ps -ef | grep ping

5. Использование команды setsid для запуска сеансов SSH

Другая утилита для достижения требуемого поведения — setsid. У Nohup есть недостаток в том смысле, что группа процессов процесса остается прежней, поэтому процесс, работающий с nohup, уязвим для любого сигнала, отправленного всей группе процессов (например, Ctrl + C).

С другой стороны, setsid выделяет новую группу процессов для выполняемого процесса, и, следовательно, созданный процесс полностью находится в новой выделенной группе процессов и может выполняться безопасно, не опасаясь быть уничтоженным даже после выхода из сеанса.

Выполните любую команду, используя setsid

Здесь показано, что процесс 'sleep 10m' был отсоединен от управляющего терминала с момента его создания.

setsid sleep 10m
ps -ef | grep sleep

Теперь, когда вы повторно войдете в сеанс, вы все равно обнаружите, что этот процесс запущен.

ps -ef | grep [s]leep

Заключение

Какие способы вы могли бы придумать, чтобы ваш процесс продолжал работать даже после выхода из сеанса SSH? Если вы можете придумать какой-либо другой и эффективный способ, укажите его в комментариях.